2012-05-02 52 views
0

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

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

“我不想要任何复杂的解决方案”没有简单的解决方案。 –

+0

听起来不对。我的意思是我是一名初学者程序员,这是一个任务。我们还没有学到任何关于多线程的知识。 – emagdnim

+0

没关系,因为多线程不是你如何做的。但它仍然很复杂。 –

回答

1

使用Tk.after_idle()注册一个功能,该功能将执行所需的工作。继续做一件事,直到所有的工作完成。

+0

谢谢,但我不确定Tk.after_idle()函数是如何工作的。你有关于它的任何文档的资源吗? – emagdnim

+0

您将可调用对象和任何参数传递给可调用对象。 –

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毫秒的迭代,等等。你可以把时间间隔改变成任何你想要的;间隔越小,代码运行速度越快,但您因事件而匮乏图形用户界面的可能性就越大。

请注意,这仅适用于<run code in here>运行速度相对较快的情况。运行时,GUI会冻结。如果它可以在几百毫秒内完成一次迭代,那么用户永远不会知道。如果需要一秒钟或更多时间,它会很明显。

注意:此示例假定您的主应用程序是从Tkinter小部件继承的对象。如果不是这种情况,它仍然可以工作,你只需要删除self参数。更好的解决方案是重构你的GUI来使用对象 - 这是一种更灵活的GUI实现方式。