背景信息
你好我当前要执行的操作是创建tkinter窗口,运行for循环并在for循环遍历目录时实时更新标签(在这种情况下,它将列出所有目录及其完整路径在我计算机的C驱动器中。
问题
我遇到的问题是,当我单击start
按钮(开始for循环)时,GUI完全冻结(我知道这是因为tkinter和loops没有)不能很好地发挥作用,我只是想知道是否有我不知道的解决方案),这很直观,因为我希望它在我的tooltip
标签中显示循环当前正在迭代的目录。
到目前为止我尝试过的事情
from tkinter import Tk, Label, Frame, Button
import os
def start_command():
for root_directory, sub_directories, files in os.walk("C:\\"):
for sub_directory in sub_directories:
full_directory = os.path.join(root_directory, sub_directory)
tooltip.config(text=full_directory)
window = Tk()
tooltip = Label(window, text="Nothing Here Yet")
tooltip.pack()
start = Button(text="Start", command=start_command)
start.pack()
window.mainloop()
Tl;博士 我正在尝试在tkinter中运行for循环,并在每次迭代时更新标签。 问题是GUI冻结了上面的代码。
任何帮助将不胜感激。 谢谢您的时间:)
答案 0 :(得分:1)
import tkinter as tk
import os
class MyDirectoryLabel(tk.Label):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.dirGen = self.directoryGen()
self.master = self._nametowidget(self.winfo_parent())
def directoryGen(self):
for root_directory, sub_directories, files in os.walk("C:\\"):
for sub_directory in sub_directories:
yield os.path.join(root_directory, sub_directory)
def loop(self):
try:
full_directory = next(self.dirGen)
except StopIteration as e:
self.config(text = "Finished...")
return 0
self.config(text = full_directory)
self.master.after(10, self.loop)
root = tk.Tk()
root.geometry("500x100")
tooltip = MyDirectoryLabel(root, text = "Nothing Here Yet")
start = tk.Button(root, text = "Start", command = tooltip.loop)
tooltip.pack()
start.pack()
root.mainloop()
结合使用after
方法和创建标签目录的generator
。
答案 1 :(得分:0)
尽管这是一种高级方法,但您可以结合使用coroutine,tkinter control variable和通用窗口小部件after()
方法来驱动更新{{ 1}}小部件,运行时开销最小。关于控制变量的一件好事是,只要从某个地方调用其Label
方法,任何引用其中一个的小部件都将自动更新,因此您不必手动进行此操作。
set()