首页 > 解决方案 > 在外部循环中更新 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()

标签: pythonpython-3.xtkinter

解决方案


遵循您问题的初始逻辑并.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()

推荐阅读