天天看点

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