【问题标题】:python, tkinter, how to destroy labels in two different tabs with for loop?python,tkinter,如何使用for循环销毁两个不同选项卡中的标签?
【发布时间】:2018-11-18 07:47:46
【问题描述】:

感谢 @Miraj50 帮助我完成 .destroy() tkinter: how to write a for loop to destroy a list of labels? 在下一阶段,我正在尝试销毁两个选项卡中的标签。我知道如何将相同的列表共享到不同的选项卡,但我不知道如何将它们“链接”到选项卡。以我有限的知识,我尝试了

def remove(self, name):
    for name in tabs[name]:
        for employee in labelemployee:
            labelemployee[employee].destroy()

它给了我这个错误:

TypeError: remove() missing 1 required positional argument: 'name'  

然后我尝试了

"for name in tabs["Requests"]" 

只是看看它是否有效。它仍然有同样的错误。如果有人可以帮助我解决这个问题并消除我的困惑,请。以下是完整代码:

import tkinter as tk
from tkinter import ttk

labelemployee={}
upper_tabs = ["Final", "Requests", "Control"]
tabs = {}

class Application(ttk.Frame): #inherent from frame.

    def __init__(self, parent):
        tk.Frame.__init__(self, parent, bg="LightBlue4")
        self.parent = parent
        self.Employees = ["A", "B", "C", "D"]
        self.pack(fill=tk.BOTH, expand=1)
        self.GUI()

    def GUI(self): #the function that runs all the GUI functions.
        self.create_tabs()
        self.buttons("Control")
        for name in upper_tabs[:2]:
        self.create_grid(name)
        self.add_left_names("Requests")
        self.add_left_names("Final")

    def create_tabs(self):
        self.tabControl = ttk.Notebook(self, width=1000, height=400)
        for name in upper_tabs:
            self.tab=tk.Frame(self.tabControl, bg='thistle')
            self.tabControl.add(self.tab, text=name)
            tabs[name] = self.tab
            self.tabControl.grid(row=0, column=0, sticky='nsew')   

    def create_grid(self, name):
        for i in range (7):
            for j in range(7):
                self.label = tk.Label(tabs[name], relief="ridge", 
                     width=12, height=3)
                self.label.grid(row=i, column=j, sticky='nsew')

    def buttons(self, name):
        self.button=tk.Button(tabs[name], text="Clear", bg="salmon",   
            command = self.remove)
        self.button.pack()

    def add_left_names(self, name):
       #--------add in name labels on the side--------------        
        i=2
        for employee in self.Employees:
            self.label=tk.Label(tabs[name], text=employee ,  fg="red", 
               bg="snow")
            self.label.grid(row=i,column=0)
            labelemployee[employee]=self.label
            i +=1

    **def remove(self, name):
        for name in tabs[name]:
            for employee in labelemployee:
            labelemployee[employee].destroy()**

def main():
    root = tk.Tk()
    root.title("class basic window")
    root.geometry("1000x500")
    root.config(background="LightBlue4")
    app = Application(root)
    root.mainloop()

if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python-3.x tkinter tabs label destroy


    【解决方案1】:

    首先,您需要跟踪所有标签。这里只分配 add_left_names 中的标签将覆盖之前的标签。所以我将标签存储在一个列表中,该列表是员工 keyvalue。现在在 remove 函数中,您只需要遍历 labelemployee 中的所有这些标签并销毁它们。

    import tkinter as tk
    from tkinter import ttk
    from collections import defaultdict
    
    labelemployee=defaultdict(list)
    upper_tabs = ["Final", "Requests", "Control"]
    tabs = {}
    
    class Application(ttk.Frame): #inherent from frame.
    
        def __init__(self, parent):
            tk.Frame.__init__(self, parent, bg="LightBlue4")
            self.parent = parent
            self.Employees = ["A", "B", "C", "D"]
            self.pack(fill=tk.BOTH, expand=1)
            self.GUI()
    
        def GUI(self): #the function that runs all the GUI functions.
            self.create_tabs()
            self.buttons("Control")
            for name in upper_tabs[:2]:
                self.create_grid(name)
            self.add_left_names("Requests")
            self.add_left_names("Final")
    
        def create_tabs(self):
            self.tabControl = ttk.Notebook(self, width=1000, height=400)
            for name in upper_tabs:
                self.tab=tk.Frame(self.tabControl, bg='thistle')
                self.tabControl.add(self.tab, text=name)
                tabs[name] = self.tab
                self.tabControl.grid(row=0, column=0, sticky='nsew')   
    
        def create_grid(self, name):
            for i in range (7):
                for j in range(7):
                    self.label = tk.Label(tabs[name], relief="ridge", width=12, height=3)
                    self.label.grid(row=i, column=j, sticky='nsew')
    
        def buttons(self, name):
            self.button=tk.Button(tabs[name], text="Clear", bg="salmon", command=self.remove)
            self.button.pack()
    
        def add_left_names(self, name):
           #--------add in name labels on the side--------------        
            i=2
            for employee in self.Employees:
                self.label=tk.Label(tabs[name], text=employee, fg="red", bg="snow")
                self.label.grid(row=i,column=0)
                labelemployee[employee].append(self.label)
                i +=1
    
        def remove(self):
            for employee in labelemployee:
                for label in labelemployee[employee]:
                    label.destroy()
    
    def main():
        root = tk.Tk()
        root.title("class basic window")
        root.geometry("1000x500")
        root.config(background="LightBlue4")
        app = Application(root)
        root.mainloop()
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

    • 嗨@Miraj50,再次感谢您的帮助。这是我第一次看到 defaultdict,我必须了解它是如何实现的。只是为了确认我的学习,我有一些问题: 1. labelemployee 是字典(defaultdict)? 2.关键是[员工]?这些值是每个员工不同选项卡中每个标签的内存位置? 4、为什么我们不使用普通字典?非常感谢您的宝贵时间。
    • @fishtang 默认字典没什么特别的。只要你声明它,变量就会自动获得一个默认值。例如在这里它将自动成为一个空列表。所以它会为我节省一两行,我必须手动检查密钥是否第一次出现,然后首先用 [] 初始化它,然后继续。是的你是对的。该值是该特定员工的小部件列表。因此,当您清除时,我会遍历列表并销毁所有列表。
    猜你喜欢
    • 2019-04-20
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多