基于循环更新tkinter标签

时间:2018-08-25 09:26:28

标签: python tkinter

背景信息

你好我当前要执行的操作是创建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冻结了上面的代码。

任何帮助将不胜感激。 谢谢您的时间:)

2 个答案:

答案 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()