天天看點

Python Tkinter界面應用開發-05 拉出

為了能夠實作計時,我們要建立一個新的方法,命名為update.為了示範這個函數的調用情況,我們在這裡列印出一個Update字元串。

def update(self):        print('updated')      

接着,我們希望我們的Update函數每秒被調用一次,這應該如何實作呢。不知道大家還記得我們的全局應用程式變量master,我們可以通過它,來使Update函數每秒調用一次。它有一個函數after,它的第一個參數是毫秒數。是以1000毫秒是一秒。然後我們希望每隔一秒調用一次它,是以第二個參數是self.update:

def update(self):
print('updated')
        self.master.after(1000, self.update)      

現在,我們來到init函數中調用它:

在所有的控件都建立之後,我們調用self.update:

self.build_gird()
self.build_banner()self.build_buttons()self.build_timer()
        self.update()      

好的,是以現在運作一下。你看,每隔一秒視窗就列印一次update:

實際上,在這個方法中,我還需要處理計時器的遞減以及計時器的重置。是以,首先,讓我們計算計時器剩餘的時間。我們會說:

def update(self):
        time_left = self.time_left.get()      

然後,如果計時器在運作并且還有剩餘的時間:

if self.running and time_left:
 self.master.after(1000, self.update)      

那麼,我們就要讓時間減一秒。是以,

if self.running and time_left:
            self.time_left.set(time_left-1)      

否則,我們就暫停計時器。

if self.running and time_left:
self.time_left.set(time_left-1)
        else:            self.stop_timer()      

這樣。它就會停止計時,并且重置按鈕。

那麼接下來,我們來對計時器的标簽進行一些操作,實際上,我們現在已經在我們的build_timer函數中繪制了計時器的标簽。

def build_timer(self):
timer = tkinter.Label(self.mainframe,text = self.timer_text.get(),font = ('微軟雅黑', 36))      

在構造函數中,我們也建立了一個用于顯示時間的的字元串變量。

self.timer_  = tkinter.StringVar()      

是以現在,我們想告訴這個變量,當這個變量被寫入資料時,或者說,被指派時,我們就調用build_timer函數,是以w意味着‘寫入’。

self.timer_text = tkinter.StringVar()
        self.timer_text.trace('w', self.build_timer)      

是以現在build_timer将被自己調用。但它被自己調用的時候,我們希望它發送更多的資訊。我們不得不使用args來記錄這些資訊,我們不會用到這些資訊,但如果不補充這個參數,Python的文法是不允許的:

def build_timer(self, *args):
timer = tkinter.Label(      

接下來,讓我們來更新這個标簽。首先,我們需要建立一個函數,來計算剩下的分鐘數和秒數。它需要一個參數:秒數。

我想傳回的分鐘,是以,這裡傳回的應該是秒除以60.還有秒模60.

def minutes_seconds(self, seconds):
return int(seconds/60), int(seconds%60) def update(self):      

是以在Update函數中,讓我們轉換下秒數.

def update(self):
time_left = self.time_left.get()if self.running and time_left:minutes, seconds = self.minutes_seconds(time_left)      

然後我們要做就是對文本變量time_text寫入資料。self.timer_text.set()。

這裡我們還需要為定時器文本設定一個格式。通常我們會這樣做,因為我們想要分和秒,是以需要用零來填充兩個數字。

minutes, seconds = self.minutes_seconds(time_left)
            self.timer_text.set(                '{:02}:{:0<2}'.format(minutes, seconds)            )      

然後在else語句之後.還需要在設定一次文本,是以複制這裡,然後粘貼到else語句之後,然後修改為DEFAULT_GAP:

else:
            minutes, seconds = self.minutes_seconds(DEFAULT_GAP)            self.timer_text.set(                '{:0<2}:{:0<2}'.format(minutes, seconds)            )
self.stop_timer()      

我們運作試試效果:

你看,當我們開始時,計時遞減,點選stop按鈕,重置計時器,沒問題。

接着。我們再來測試,當25分鐘過後,是否正确,但這裡,我不想等待25分鐘。是以讓我們修改預設的計時,是以,來到檔案的頂部,修改值為5:

DEFAULT_GAP = 25 * 60
DEFAULT_GAP = 5