python - 在Tkinter中,while循环导致整个程序崩溃

5 投票
1 回答
9997 浏览
提问于 2025-04-20 12:53

我正在尝试使用一个“While循环”来不断执行某个操作。目前,这个循环只会导致我的程序崩溃。

这是我的代码:

import tkinter
def a():
    root = tkinter.Tk()
    canvas = tkinter.Canvas(root, width=800, height=600)
    while True:
        print("test")

a()

这个循环会一直执行print语句,但实际上画布就是打不开。

有没有什么可以和Tkinter一起工作的无限循环?

额外信息 当我去掉While True这行代码时,画布又会重新出现。

1 个回答

19

Tkinter会卡住,除非它能执行自己的无限循环,也就是root.mainloop。通常情况下,你不能让自己的无限循环和Tkinter的循环同时运行。不过,有一些替代的方法可以尝试:

使用 after

after 是一个Tkinter的方法,它可以让你指定一个函数在一定时间后执行。你可以让一个函数自己调用after,这样它就会重复执行。

import tkinter

#this gets called every 10 ms
def periodically_called():
    print("test")
    root.after(10, periodically_called)

root = tkinter.Tk()
root.after(10, periodically_called)
root.mainloop()

还有一个方法是root.after_idle,这个方法会在系统没有其他事件需要处理时立即执行目标函数。如果你需要更快的循环,比如每毫秒执行多次,这个方法可能更合适。

使用 threading

threading模块允许你同时运行两段Python代码。通过这种方法,你可以让两个无限循环同时运行。

import tkinter
import threading

def test_loop():
    while True:
        print("test")

thread = threading.Thread(target=test_loop)
#make test_loop terminate when the user exits the window
thread.daemon = True 
thread.start()

root = tkinter.Tk()
root.mainloop()

但要小心:如果在主线程以外的线程中调用Tkinter的方法,可能会导致程序崩溃或者出现奇怪的行为。

撰写回答