【发布时间】:2021-01-12 15:50:03
【问题描述】:
This 是一个类似的问题,所以我认为我在正确的论坛中。我有一个 tkinter 应用程序,可以计算某些东西的“步数”。经过大约 20 亿次 +1 加法(接近最大 32 位 int 的大小),Entry 小部件中显示的计数不再可供用户访问——无法将光标聚焦在显示的值上,也无法选择一些或值的所有字符。如果我重新启动应用程序并在开始之前将计数预设(“更新”)为 1999999999,则此问题仍然需要 20 亿步或更多才能显现出来。下面是一个精简的应用程序,它在 64 位 Windows 10 和 Raspberry Pi 4 上显示了这个问题。(原始脚本已被替换。参见 cmets。17Jan2021)
from tkinter import * #python3
start = False
count = 0
def startCount():
global start
start = True
countUp()
def stopCount():
global start
start = False
eVal.set(count)
def get_eVal():
global count
count = int(eVal.get())
def countUp():
global count, start
count += 1
if count % 1000 == 0:
eVal.set(count)
if start:
on.after_idle(countUp)
root = Tk()
eVal = StringVar()
frame = Frame(root)
on = Button(frame, text='Start', command=startCount)
off = Button(frame, text='Stop', command=stopCount)
updt = Button(frame, text='Update', command=get_eVal)
entry = Entry(frame, textvariable=eVal, width=20, justify=RIGHT)
on.pack(side=LEFT)
off.pack(side=LEFT, padx=(8,4), pady=6)
updt.pack(side=LEFT, padx=(4,8))
entry.pack(side=LEFT)
frame.pack()
mainloop()
到目前为止,在我更大的应用程序中,当发生此问题时,用户将无法访问所有 Entry 小部件。 这是一个已知的 tkinter 问题吗?有什么简单的解决方法吗?
【问题讨论】:
-
我无法运行您的示例,我收到一个错误,表明 eVal 未定义。可能是因为,eVal 是在 main 中定义的,但不能全局用于函数 startCount、stopCount、get_eVal 等?,
-
我在运行这个脚本时没有遇到这个问题,但无论如何,请尝试通过 quit = False 语句将 eVal = StringVal() 语句向上移动并根据需要添加全局。你用什么python3/系统?顺便说一句,我认为 if name == 'main': 的范围是全局的。
-
不,再三考虑,不要将 eVal = StringVal() 语句移到 root = TK() 之前。很抱歉,我不知道您的问题是什么。
-
您是否尝试在最后删除您的
while循环?使用你自己的循环并调用update不如让mainloop完成它的工作效率高,而且实际上可能会导致问题。这不是 tkinter 的设计用途。 -
我已经编辑了脚本以避免.update,但是如果我点击条目的显示,这个版本很容易出现“无响应”。在没有任何答案的情况下,我会接受答案是“不,这不是已知的 tkinter 问题”。尤其是 mainloop() 似乎不是一个简单的解决方法。
标签: python-3.x tkinter tkinter-entry