【发布时间】:2011-06-16 09:12:43
【问题描述】:
抱歉这个菜鸟问题,但我真的不明白。
我正在使用 python / tkinter,我想显示一些东西(比如,上面有一些形状的画布),并保持显示直到程序退出。我知道在我致电tkinter.tk.mainloop() 之前不会显示任何小部件。但是,如果我调用tkinter.tk.mainloop(),在用户关闭主窗口之前我将无法执行任何其他操作。
我不需要监控任何用户输入事件,只是显示一些东西。在不放弃对mainloop 的控制权的情况下,有什么好的方法可以做到这一点?
编辑:
这个示例代码合理吗:
class App(tk.Tk):
def __init__(self, sim):
self.sim = sim # link to the simulation instance
self.loop()
def loop():
self.redraw() # update all the GUI to reflect new simulation state
sim.next_step() # advance simulation another step
self.after(0, self.loop)
def redraw():
# get whatever we need from self.sim, and put it on the screen
EDIT2(添加 after_idle):
class App(tk.Tk):
def __init__(self, sim):
self.sim = sim # link to the simulation instance
self.after_idle(self.preloop)
def preloop():
self.after(0, self.loop)
def loop():
self.redraw() # update all the GUI to reflect new simulation state
sim.next_step() # advance simulation another step
self.after_idle(self.preloop)
def redraw():
# get whatever we need from self.sim, and put it on the screen
【问题讨论】:
-
这是多线程的用武之地吗?
-
@max:非常接近。这是正确的概念,尽管我建议不要在值为零之后给予。 GUI 事件不应该花费很长时间,但它们花费的时间超过零毫秒。您必须使用该值来感受是什么提供了良好的 GUI 性能,同时仍然让您的主要逻辑以最快的速度运行。
-
@Bryan:我不敢测试延迟值;如果程序稍后在另一个环境中运行(例如,使用不同的分辨率等)怎么办?也许我应该改用
after_idle- 这会解决问题还是有其他问题? -
@max: 使用
after_idle可能会锁定您的GUI。空闲任务一直运行,直到空闲队列上没有任何内容,因此如果您在空闲期间执行某些操作,将某些内容放入队列,则队列永远不会为空。普遍接受的解决方案是after_idle调用具有零值的after来安排您的工作。这使 tk 有机会处理所有空闲事件(例如屏幕重绘),然后在运行回调之前处理任何其他事件(例如鼠标移动)。 -
谢谢 - 你指的是我编辑的代码吗?
标签: python user-interface tkinter