运行Python图形和代码

时间:2012-05-02 05:48:02

标签: python tkinter

我有一个程序,我只是添加图形,但我在运行主代码和图形时遇到问题。基本上我有这样的事情:

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或图形,因为我在代码中首先运行的是唯一运行的。它不会停止允许下一个代码运行。必须有一种简单的方法让图形和代码并排运行。谢谢!

2 个答案:

答案 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实现方式。