用python編寫一個屏保程式(背單詞)
阿新 • • 發佈:2018-12-25
大家好,我是一名即將畢業的大學生,第一次在CSDN上發表文章,之前在其他的部落格上也寫過,但是總的來說,這個平臺的資源要多一些(個人覺得),所以有很多不懂的地方希望大家多多指教。
今天我要給大家分享的是一款自己寫的屏保程式,大學嘛大家最頭疼的就是四六級的考試了,上次考試做閱讀的時候,情不自禁的發呆,想著如果我能在電腦上寫一個屏保程式,那麼就可以天天記單詞了!
開始
首先:我們使用的是python自帶的GUI模組,大部分操作網上都可以查到,對於寫一些小的互動程式是完全夠了。首先我們來定義一個類,這個類可以實列出一個螢幕顯示物件,我把它稱為Screensaver()。
from tkinter import *
import tkinter.font as tkFont # 匯入了一個字型
class Screensaver():
txt_1 = [] # 用來儲存例項物件
i = 1 # 用於後期判斷是否更新單詞表
def __init__(self):
self.win = Tk() # 基於tkiner中的Tk()方法例項個物件
self.ft = tkFont.Font(family='Fixdsys', size=30, weight=tkFont.BOLD) # 修改字型的方法
self. width = self.win.winfo_screenwidth() # 獲取螢幕大小
self.height= self.win.winfo_screenheight()
self.win.overrideredirect(1) # 全屏設定
self.win.attributes('-alpha',0.3) # 以引數alpha的方式設定透明度
# 繫結事件
self.win.bind('<Any-Button>',self.exit_screensaver) # 單擊滑鼠即彈出
self.canvas=Canvas(self.win,width=self.width,height=self.height,bg='#00FFFF')
self.canvas.pack()
self.win.mainloop()
def exit_screensaver(self,event): # 這裡必須要個引數event
self.win.destroy()
Screensaver() # 例項化
執行結果:
可以看到,螢幕有透明的一層,這就是我們例項化的物件,它以cavans(畫布的形式),類似於photoshop裡面的畫層一樣,可以在上面不斷疊加畫層。
接下來,我們要建立文字類:Text_screen(),用它來建立文字,並使其能移動文字和建立文字。
class Text_screen():
list_box = [i for i in range(20,1080,50)] # 22 個個數,分別代表螢幕的高度位置
i = 0 # 用來在高度上取值
def __init__(self,canvas,ft,width,height,text_1):
self.canvas = canvas
self.ft = ft
self.text_1 = text_1
self.x_pos = width
self.x_move = -1
self.create_text()
def create_text(self): # 建立方法
self.x1 = self.x_pos-100
self.item = self.canvas.create_text(self.x1,self.list_box[Text_screen.i],text=self.text_1,font=self.ft,fill='red',anchor=NW)
if Text_screen.i == len(Text_screen.list_box)-1:
Text_screen.i = 0
else: Text_screen.i += 1
def move_text(self): # 移動文字
self.canvas.move(self.item, self.x_move,0)
self.x1 += self.x_move
最後
我們來整合著兩個類:
在Screensaver()類中新增三個函式:
def birth_list(self): #生成文字,
i = randint(0,2064)
self.str_text = linecache.getlines('six.txt')[i:i+21] # 這裡需要匯入模組:linecache,並且這裡的檔案是單詞文字,要注意它的編碼格式。
if self.i == 1:
for my_text in self.str_text:
txt = Text_screen(self.canvas,self.ft,self.width,self.height,my_text)
self.list_.append(txt)
else: pass
def exit_screensaver(self,event): # 這裡必須要個引數event
self.win.destroy()
def run_screensaver(self): # 迴圈體 ,不斷更新螢幕內容
if self.i == 1:
for emumt in self.list_:
emumt.move_text()
if emumt.x1<= -30:
emumt
self.i = -1
self.delect()
self.list_ =[]
self.birth_list()
for my_text in self.str_text:
txt = Text_screen(self.canvas,self.ft,self.width,self.height,my_text)
self.list_.append(txt)
break
else:
self.i *= -1
self.canvas.after(1,self.run_screensaver) # 第一個引數是間隔事件吧?第二個是呼叫函式
def delect(self):# 不斷的刪除螢幕物件
for em in self.list_:
self.canvas.delete(em.item)
這裡我們就講完所有的步驟了,大致的執行結果如圖:
需要注意的是:這裡的單詞是我在網上下的,如果下載好的六級單詞,不是utf格式的需要使用記事本 -> 另存為 -> 選擇格式。
總結
缺點:
1、這裡面的程式碼可以簡練很多的,最近沒時間去看,只是粗略的完成了效果,希望大家多多指教。
2、可能對於cpu的消耗有點大,正如上所說,完全可以簡化程式碼。
3、請大家多多指點。
大家可以在我的部落格中下載原始碼和txt檔案的壓縮包
或者在github上檢視程式碼:github
謝謝大家!!!