tkinter窗口在一段时间后冻结



我是Tkinter的新手。我正在试验这个,但是虽然 Tkinter 启动得很好,但有时会无缘无故地冻结一段时间。实际上,发生的奇怪事情是,虽然 Tkinter 窗口不再更新信息,但计数器继续在我的 WINDOWS 桌面左上角打印!(只是黑色的BG框,白色字体显示计数器编号(并最终找到数字777并结束。但是中间长时间冻结,即使没有任何打印(也不是在我的Windows桌面上(

这是正常的 tkinter 窗口 这是控制台输出 这里都很好

疯狂的窗口显示在这里

这里的简单程序生成从 1 - 10000 的随机整数,应该 1( 如果找到 777,它应该打印计数器并退出 2( 如果找到 1-100 之间的任何数字,它应该打印数字和计数器。

我正在尝试学习如何在同一行中打印新内容,如果发生某些事情,请在另一行上打印更多信息,而第一行(或更多(继续更新。

我不确定我是否以正确的方式退出程序,或者我应该如何使用/调用 Tkinter 函数来更新屏幕上的信息。

任何帮助或提示,非常感谢。

from tkinter import *
import random
import time
tk=Tk()
i = 0
counter = 0
tk.title("Testing...")
tk.geometry('300x200')
canvas_width = 200
canvas_height = 100
canvas = Canvas(tk, width=canvas_width, height=canvas_height, bg='white')
canvas.pack(expand=YES)
def screen(Found):
#canvas.create_text(20, 20, text="Counter:" + str(counter), font="Times 20 italic")
widget = Label(canvas, text="Counter:" + str(counter), fg='white', bg='black')
widget.grid(column=0, row=0)
if Found:
widget = Label(canvas, text="Number " + str(i) +" was found at counter:" + str(counter), fg='white', bg='black')
widget.grid(column=0, row=1)
found = False
loop = True
while loop:
counter += 1
i = random.randint(1, 10000)
if i in range(1, 100):
print("Found i = ", i, " in counter:", counter)
Found = True
else:
Found = False
if i == 777:
loop = False
print("JUST FOUND 777")
print("Counter:", counter)
screen(Found)
tk.update_idletasks()
tk.update()
# tk.mainloop()

作为设计问题,依靠 tkinter 主循环来驱动应用程序通常是一种更好的方法。root.after是 while 循环的绝佳替代品。标签不需要重新创建;他们可以使用特殊变量来更新显示的值本身,并且可以重新配置其属性。几乎不需要打电话给updateupdate_idletasks

以下可能是一种更好的方法,其中从由 tkinter 主循环提供支持的循环更新单个标签:
(它向您展示"如何在没有此类标签问题的情况下继续显示新内容"(

import tkinter as tk
import random
def screen(found, v, c):
if found:
label.configure(bg='red', fg='blue')
print('found')
else:
label.configure(bg='black', fg='white')
update_lbl_txt(v, c)
def update_lbl_txt(v=0, c=0):
txt = f'Number at {v} was found at counter {c}'
lbl_txt.set(txt)
def found_target(t):
return t in range(1, 100) or t == 777
def loop(c=0):
v = random.randint(1, 10000)
screen(found_target(v), v, c)
root.after(100, loop, c+1)
root = tk.Tk()
root.title("Testing...")
root.geometry('300x200')
lbl_txt = tk.StringVar(root)
update_lbl_txt()
label = tk.Label(root, textvariable=lbl_txt, fg='white', bg='black')
label.pack(expand=True, fill=tk.BOTH)
loop()
root.mainloop()

它似乎冻结它的原因至少部分是因为你有一个你永远不会打破的无限循环。大多数情况下,i不会在 1 到 100 的范围内,也不会是 777,但您的循环将继续运行并且永远不会更新屏幕。

您还需要每秒创建数百或数千个标签小部件,这些小部件堆叠在一起。您将很快遇到性能问题。

最新更新