当前位置: 首页 > 面试题库 >

循环时导致整个程序在Tkinter中崩溃

融唯
2023-03-14
问题内容

我试图运行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语句时,画布会再次出现。


问题答案:

除非它可以执行自己的无限循环,否则Tkinter会挂起root.mainloop。通常,您无法与Tkinter并行运行自己的无限循环。但是,有一些替代策略:

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方法可能会导致崩溃或导致异常行为。



 类似资料:
  • 我正在使用内置于Web View的Android开发浏览器。其中我面临的一个问题是,当我访问http://crashmybrowser.com测试浏览器上的选项卡崩溃时,我的整个浏览器应用程序都会崩溃。但是,当在chrome或Opera上进行相同的测试时,这些浏览器会在崩溃中幸存下来,并且只有特定的选项卡崩溃是由于访问上述网站而预期的结果。有人能帮助理解我如何在使用Webview的浏览器上处理此崩

  • 问题内容: 我已经使用线程编写了python tkinter代码,以便tkinter向导通过在主线程中运行的tkinter mainloop和在单独线程中运行的后台进程自动更新。但是我注意到,运行代码一段时间后python崩溃了。此外,它本质上是随机的,但python大部分时间都崩溃。我写了一个小的测试代码来显示这个问题(我的原始代码与此类似,但是具有一些实际的过程和许多其他功能,因此我将共享测试

  • 我试图从我的框架中获得轮廓,这就是我所做的: .................................................... 程序在处崩溃,我收到以下错误消息: OpenCV错误:不支持的格式或格式组合([开始]FindContour只支持8uC1和32sC1图像)在未知的功能,文件......\src\openc v\模块\imgproc\src\contours.cp

  • 这里是Android开发者新手。我在MainActivity中使用recyclerview,应用程序不断崩溃。 任何帮助都将受到赞赏! 编辑:对不起,我是新来的。我已经附加了Logcat。和其他xml文件。谢谢 这是我的代码: 列出你的布局。xml: activity_main.xml: } ProductAdapter。java类: } Logcat: 致命异常:主进程:e.wolverine2

  • 我一直在研究GNU的g编译器编译的汇编,它看起来像一个无限循环(g -S file.c -o的部分输出): 除了最后一条jmp指令之外,所有这些指令都是movq或计算指令,但这只是让我们回到.L3。这是以下代码的主体: 它是如何退出循环的?看起来它只是减少了i(subq$1,-8(%rbp)),并在没有比较的情况下重新启动。

  • 我试图制作一个图形用户界面,不断绘制从微处理器接收的信号。我试图通过只使用类来实现这一点,但是失败了,因为只有GUI类是oppend。现在我已经实现了线程(或者至少我认为我有!?)但是每个线程只运行一次。这让我相信我不明白tkinter中的主循环是如何工作的,所以我可以重新编写我的代码,让线程变得活跃吗? 我希望你们中的一些人能帮助我把这段代码变成一个实时更新绘图的程序。 但是它仍然没有更新plo