python-3.x 用tkinter?创建主循环

eqoofvh9  于 2023-03-20  发布在  Python
关注(0)|答案(1)|浏览(148)

我有这个代码:

from tkinter import *

root = Tk()
while True:
    print('hello')
    root.update()

root.mainloop()

这里的主循环是:

while True:
    print('hello')
    root.update()

但我不确定这是最好的方法(如果我想输入一些东西,这就不起作用了)
然后我试了这个:

from tkinter import *
from threading imoport Thread
import time

root = Tk()

text = Label()
text.pack()

def main():
    while True:
        text[text] = str(time.time())

thread = Thread(target=main)
thread.start()

root.mainloop()

但我意识到这并没有我预期的那么快。所以问题是:创建主循环的最佳方法是什么?

pobjuy32

pobjuy321#

Tkinter为它提供了一个强大的工具,它被称为after。这个命令被用来延迟程序的执行或在将来的某个时候在后台执行命令。
之后,内置的Tcl命令管理脚本的调度以供将来评估,同时还充当同步休眠命令。

import tkinter as tk #import tkinter
import datetime #import datetime for our clock

def tick(): #function to update the clock
    showed_time = clock['text'] #current showed time
    current_time = datetime.datetime.now().strftime("%H:%M:%S") #real time
    if showed_time != current_time: #if the showed time is not the real time
        showed_time = current_time #update the variable to compare it next time again
        clock.configure(text=current_time) #update the label with the current time
    clock.after(1000, tick) #call yourself in 1000ms (1sec.) again to update the clock
    return None

root=tk.Tk()

clock = tk.Label(root)
clock.pack()
tick()

root.mainloop()

在上面的脚本中,我们已经建立了一个数字时钟,并且接触到了after方法,after方法只是一个间隔,在这个间隔的末尾,我们希望发生一些事情。
要了解有关此基本小部件方法的详细信息[单击]

之后(延迟毫秒,回调=无,参数)

此方法注册了一个回调函数*,它将在给定的毫秒数 * 之后被调用。Tkinter仅保证*回调函数不会在该时间之前被调用 *;如果系统忙碌,则实际延迟可能长得多。

import tkinter as tk 
import datetime 

def tick():
    showed_time = clock['text']
    current_time = datetime.datetime.now().strftime("%H:%M:%S")
    if showed_time != current_time:
        showed_time = current_time
        clock.configure(text=current_time)
    global alarm #make sure the alarm is known
    alarm = clock.after(1000, tick)#assign the alarm to a variable
    return None
def stop():
    stop.after_cancel(alarm) #cancel alarm
    

root=tk.Tk()

clock = tk.Label(root)
clock.pack()
stop = tk.Button(root, text='Stop it!', command=stop)
stop.pack()
tick()

root.mainloop()

这里我们有相同的代码,但是能够使用tkinter的after_cancel方法 * 取消 * 我们的循环。您不需要在类中全局报警self.alarm = self.clock.after(...)工作正常。

取消后(标识)

取消报警回叫。

  • 身份证 *

报警标识符。
Why threading isn't a good choice in coding frame work.

相关问题