【问题标题】:python - While Loop causes entire program to crash in Tkinterpython - While Loop 导致整个程序在 Tkinter 中崩溃
【发布时间】:2014-09-08 19:46:32
【问题描述】:

我正在尝试运行 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,但从文档看来,您必须调用pack 方法才能实际显示一个对象(例如画布)。
  • 你好,凯尔。感谢您的评论。基本上,当我删除“While True”并让它打印文本时,画布确实出现了。我会将这些额外信息编辑到我的问题中。

标签: python python-3.x tkinter


【解决方案1】:

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

【讨论】:

  • 嗨凯文。您的解决方案效果很好,但我也想在其他一些程序中实现它。有没有一种方法可以在没有函数的情况下进行循环?
猜你喜欢
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 2013-07-25
  • 1970-01-01
相关资源
最近更新 更多