gpt4 book ai didi

python - Tkinter:一个或多个主循环?

转载 作者:太空宇宙 更新时间:2023-11-03 19:27:37 24 4
gpt4 key购买 nike

我有一个已经很大的 Tkinter 程序,因此我有一个 init 文件,其中定义了 root = Tk() 窗口(基本上包含一个 Text 小部件和一些其他东西),更多代码,最后调用 mainloop() 函数。

一切正常,直到我需要在mainloop之前调用一个过程,并且我想在开始时引发一个wait窗口,在程序结束时被销毁。

我写了这样的内容:

msg = Message(root, text='wait a few seconds...')
msg.pack()

但是它没有也不能工作,因为 mainloop() 尚未被调用!

如果我这样做:

msg = Message(root, text='wait a few seconds...')
msg.pack()
mainloop()

程序在第一个主循环处停止,未完成过程调用。

mainloop() 应该用作最后一个程序行,之后 Tkinter 程序通过用户点击和交互等驱动的逻辑工作。

在这里,我需要一系列引发窗口>执行操作>销毁窗口>主循环

最佳答案

您是正确的,在程序初始化后,需要调用一次 mainloop 。这是启动事件循环所必需的,也是窗口绘制自身、响应事件等所必需的。

您可以做的是将初始化分为两部分。第一个——创建等待窗口——发生在启动事件循环之前。第二步——执行其余的初始化——在事件循环启动后发生。您可以通过 after 方法安排第二阶段来完成此操作。

这是一个简单的例子:

import Tkinter as tk
import time

class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):

# initialize Tkinter
tk.Tk.__init__(self, *args, **kwargs)

# hide main window
self.wm_withdraw()

# show "please wait..." window
self.wait = tk.Toplevel(self)
label = tk.Label(self.wait, text="Please wait...")
label.pack()

# schedule the rest of the initialization to happen
# after the event loop has started
self.after(100, self.init_phase_2)

def init_phase_2(self):

# simulate doing something...
time.sleep(10)

# we're done. Close the wait window, show the main window
self.wait.destroy()
self.wm_deiconify()

app = SampleApp()
app.mainloop()

关于python - Tkinter:一个或多个主循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7499923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com