运行Python图形和代码

运行Python图形和代码,python,tkinter,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, anch

我有一个程序,我只是添加图形,但我有麻烦运行我的主代码和图形。基本上我有这样的东西:

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()

我只能运行main函数或graphics,因为我在代码中首先运行的是唯一运行的函数。它不会停止以允许下一个代码运行。必须有一种简单的方法让图形和代码并排运行。谢谢

使用
Tk.after\u idle()
注册一个函数,该函数将完成所需的一部分工作。继续一件一件地做,直到所有的工作都完成。

一般来说,不能在Tkinter应用程序中放入无限循环。为什么?它已经在运行一个无限循环:事件循环。您的代码与此等效:

while <there are more events to service>:
    while True:
        <run code in here>
    <get the next event>
    <service the event>
然后,在主逻辑中的某个地方,或者响应一个按钮,调用
doone\u迭代
。它将对以前的无限循环进行一次迭代。完成后,它指示Tkinter在100毫秒后再次调用自己。当这个时间段过去时,你的代码运行,它会在100毫秒内安排另一次迭代,等等。你可以根据自己的需要更改间隔;间隔越小,代码运行越快,但GUI缺少事件的可能性越大

请注意,这仅在
运行相对较快时有效。当它运行时,您的GUI将冻结。如果它能在几百毫秒内完成一次迭代,那么用户永远不会知道。如果需要一秒钟或更长时间,它将是明显的


注意:本例假设您的主应用程序是从Tkinter小部件继承的对象。如果不是这样,它仍然可以工作,您只需删除
self
参数。一个更好的解决方案是重构GUI以使用对象——这是一种更灵活的实现GUI的方法

“我不想要任何复杂的解决方案”没有简单的解决方案。这听起来是错误的。我的意思是,我是一个初学者程序员,这是一个作业。我们还没有学到任何关于多线程的知识。没关系,因为多线程不是你应该做的。但是它仍然很复杂。谢谢,但是我不确定Tk.after_idle()函数是如何工作的。您是否有任何文档的资源?您将向其传递一个可调用文件和任何参数。
def do_one_iteration(self):
    <run code in here>
    self.after(100, self.do_one_iteration)