python - 在外部循环中更新 Tkinter GUI
问题描述
我将我的代码设置为打印出来以控制它的进度,因为它循环了几千个项目。这工作得很好,直到我将它打包并分发给其他人,因为不再有控制台。我当前的方法有效,但在循环继续运行时,GUI 在几次迭代后始终挂起。
下面的示例代码运行,但我的循环要复杂得多并挂断。我很好奇是否有更好的方法来实现这一点,因为我喜欢使用这些 GUI,但是当我处于不同的循环中时,我还没有找到一种将数据发送到 GUI 的好方法。
from tkinter import *
import time
def do_loop(num_cycles):
for i in range(0, int(num_cycles)):
time.sleep(.25)
# print(i)
GUI_MSG.set(str(i))
Tk.update_idletasks(FORM)
FORM = Tk()
GUI_MSG = StringVar()
FORM.wm_title('Perform Element Analysis')
IO_FRAME = LabelFrame(FORM, text=' Input/Output Directories ')
IO_FRAME.grid(row=0, sticky='W', padx=5, pady=5, ipadx=5, ipady=5)
Label(IO_FRAME, text="Numer of Loops").grid(
row=1, column=1, padx=5, pady=(10, 2), sticky='E')
NUMBER_LOOPS = Entry(IO_FRAME, width=10)
NUMBER_LOOPS.grid(row=1, column=2, columnspan=4)
Button(FORM, text='Generate Tables', command=lambda: do_loop(
NUMBER_LOOPS.get())).grid(row=3, column=0, sticky='WE', padx=5, pady=5)
Label(FORM, textvariable=GUI_MSG).grid(row=2, sticky='WE', padx=5, pady=20)
FORM.mainloop()
解决方案
遵循您问题的初始逻辑并.after()
用于在函数外部引用:
from tkinter import *
def do_loop():
global count,num_cycles,GUI_MSG
if count<int(num_cycles):
GUI_MSG.set(str(count))
count+=1
FORM.after(1000,do_loop)
def get_cycles():
global num_cycles
num_cycles=NUMBER_LOOPS.get()
do_loop()
count=0
FORM = Tk()
GUI_MSG = StringVar()
FORM.wm_title('Perform Element Analysis')
IO_FRAME = LabelFrame(FORM, text=' Input/Output Directories ')
IO_FRAME.grid(row=0, sticky='W', padx=5, pady=5, ipadx=5, ipady=5)
Label(IO_FRAME, text="Numer of Loops").grid(
row=1, column=1, padx=5, pady=(10, 2), sticky='E')
NUMBER_LOOPS = Entry(IO_FRAME, width=10)
NUMBER_LOOPS.grid(row=1, column=2, columnspan=4)
Button(FORM, text='Generate Tables', command=get_cycles).grid(row=3, column=0, sticky='WE', padx=5, pady=5)
Label(FORM, textvariable=GUI_MSG).grid(row=2, sticky='WE', padx=5, pady=20)
FORM.mainloop()
推荐阅读
- css - sass-loader 不生成 CSS
- firebase - ScopedModel 与 Firestore 添加重复记录
- excel - VBA 将公式转换为注释
- reactjs - 使用 react 与 angular 构建 ionic 4 应用程序之间的性能差异
- android - 我想突出显示 ArrayList 的单个单词
- jsp - 如何使用jsp中的post方法将隐藏的表单字段传递给servlet过滤器的doFilter方法?
- javascript - 如何在 React js 中修复“相同的道具传递给孩子”?
- performance - LINQ AsNoTracking 运行缓慢
- servicestack - 覆盖特定端点上的 AutoQuery MaxLimit
- javascript - 从其他组件中的服务访问数据