我有一个程序,我只是添加图形,但我在运行主代码和图形时遇到问题。基本上我有这样的事情:
def mainFunction():
while True:
run code in here
root = Tk()
board = Canvas(root, height=710, width=1000)
board_image = PhotoImage(file="/path/example.jpg")
photo = board.create_image(0,0, anchor=NW, image=board_image)
board.pack()
mainFunction
root.mainloop()
我只能运行mainFunction或图形,因为我在代码中首先运行的是唯一运行的。它不会停止允许下一个代码运行。必须有一种简单的方法让图形和代码并排运行。谢谢!
答案 0 :(得分:1)
使用Tk.after_idle()
注册一个能够完成所需工作的件的功能。继续做一件事,直到完成所有工作。
答案 1 :(得分:0)
一般来说,你不能在Tkinter应用程序中放置一个无限循环。为什么?它已经在运行一个无限循环:事件循环。您的代码相当于:
while <there are more events to service>:
while True:
<run code in here>
<get the next event>
<service the event>
看到问题?您正在阻止代码为事件提供服务,事件是GUI的生命线。
相反,您需要通过添加要在循环内运行的代码来利用已经运行的无限循环。您可以使用after
(和after_idle
)执行此操作。这将把一个偶数放在队列中。如果在处理该事件期间再次调用after_idle
,您就可以有效地设置一个在事件循环中起作用的无限循环。
例如:
def do_one_iteration(self):
<run code in here>
self.after(100, self.do_one_iteration)
然后,在主逻辑中的某个位置或响应按钮时,您调用do_one_iteration
。它将对您之前的无限循环进行一次迭代。完成后,它指示Tkinter在100毫秒后再次调用自己。当该时间段过去后,您的代码将运行,它会在100毫秒内安排另一次迭代,等等。您可以将间隔更改为您想要的任何内容;间隔越小,代码运行的速度就越快,但是你将GUI用于事件的可能性就越大。
请注意,这只适用于<run code in here>
运行速度相对较快的情况。在运行时,GUI会冻结。如果它可以在几百毫秒内完成一次迭代,那么用户永远不会知道。如果需要一秒钟或更长时间,那将是显而易见的。
注意:此示例假定您的主应用程序是从Tkinter小部件继承的对象。如果情况并非如此,它仍然有效,您只需删除self
参数即可。更好的解决方案是重构GUI以使用对象 - 这是一种更灵活的GUI实现方式。