当前位置: 首页 > 知识库问答 >
问题:

用tkinter创建主循环?

易琨
2023-03-14

我有以下代码:

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()

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

共有1个答案

冯渝
2023-03-14

Tkinter为它提供了一个强大的工具,它在之后被调用。它的目的是作为同步睡眠命令,但可以通过调用自身在mainloop内部构建一个循环。

之后,一个内置的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方法只不过是一个区间,在这个区间的末尾,我们希望发生一些事情。

要了解有关此基本小部件方法的更多信息,请单击

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

此方法注册一个回调函数,该函数将在给定的毫秒数后调用。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\u cancel方法取消循环。您不需要在类中全局设置警报<代码>自我。报警=自我报警。时钟在(…)之后 工作正常。

取消后(id)

取消报警回调。

身份证件

报警标识符。

为什么线程不是编码框架工作的好选择。

 类似资料:
  • 问题内容: 我有以下代码: 这里的主要循环是: 但是我不确定这是做到这一点的最佳方法(如果我想输入一些信息,这将不起作用) 然后我尝试了这个: 但是,正如我已经意识到的那样,它并没有达到我的预期。所以问题是:创建主循环的最佳方法是什么? 问题答案: Tkinter为此提供了一个强大的工具,它被称为after。它旨在用作同步睡眠命令,但可以通过调用自身在mainloop内建立一个循环。 之后,是一个

  • 问题内容: 到现在为止,我以前以:结束我的Tkiter程序,否则什么都不会出现!参见示例: 但是,当尝试该程序的下一步(使球随着时间移动)时,该书正在阅读,并说要执行以下操作。将绘图功能更改为: 并将以下代码添加到我的程序中: 但是我注意到,添加此代码块使之无用,因为即使没有它,所有内容也会显示出来!!! 此时,我应该提到我的书从未谈论过(也许是因为它使用了Python 3),但是由于我的程序无法

  • 问题内容: 如何从单独的对象调用tkinter ? 我在寻找类似wxWidgets的东西。例如,如果我创建一个对象,并将其根实例传递给它,然后尝试从我的对象中调用该根窗口的方法,则我的应用程序将锁定。 我能想到的最好的方法是使用该方法并从单独的对象检查状态,但这似乎很浪费。 问题答案: 要回答“如何从单独的对象调用TkInter事件”这一特定问题,请使用命令。它允许您将事件注入到根窗口的事件队列中

  • 我试图在一个for循环中创建按钮。在每个循环中,将i计数值作为命令值中的参数传递出去。因此,当从命令值调用函数时,我可以判断哪个按钮被按下并相应地操作。问题是,假设len是3,它将创建3个按钮,标题为“游戏1”到“游戏3”,但是当按下任何一个按钮时,打印值总是2,最后一次迭代。所以看起来按钮是作为单独的实体制作的,但是命令参数中的i值似乎都是一样的。下面是代码: 有没有办法在每次迭代时获取当前的i

  • 我正在为我的公司开发一个“多层”GUI来监控温度和状态。因为我是python编程新手,所以我的代码需要一些帮助。 代码由类构成。“Main”初始化主窗口(tkinter)并创建其他要显示的帧(如果需要)。除“canvas”外,其他每个类都是一个框架,它将显示不同的内容。 每个画布都包含一个图像和一些文本/可变文本。线程用于从数据库获取数据并更改画布中的文本。 每次线程访问画布并尝试更改文本或创建新

  • 问题内容: 如何从while循环中创建sql server cte 这样的循环 问题答案: 如果需要表: 如果您需要一个字符串: