Label.Destroy难度

时间:2016-02-24 19:56:02

标签: python-3.x tkinter

我想通过点击按钮为我的Toplevel窗框添加和删除标签。

def Option_1_Function():

    def Add_Label_Function():
        My_Label_1 = Label(root_Option_1, text="First Label")
        My_Label_1.pack(side=BOTTOM)
        My_Label_2 = Label(root_Option_1, text="Second Label")
        My_Label_2.pack(side=BOTTOM)
        My_Label_3 = Label(root_Option_1, text="Third Label")
        My_Label_3.pack(side=BOTTOM)
        return

    def Delete_Label_Function():
        My_Label_1.Destroy()
        My_Label_2.Destroy()
        My_Label_3.Destroy()
        return

    root_Option_1 = Toplevel()
    root_Option_1.geometry("300x300")
    My_Button_3 = Button(root_Option_1, text="Add Label", command=Add_Label_Function)
    My_Button_3.pack(side=LEFT)
    My_Button_4 = Button(root_Option_1, text="Delete Label", command=Delete_Label_Function)
    My_Button_4.pack(side=RIGHT)
    root_Option_1.mainloop()
    return

def Option_2_Function():
    return

root = Tk()
root.geometry("200x200")
My_Button_1 = Button(root, text="Option 1", command=Option_1_Function)
My_Button_1.pack(side=LEFT)
My_Button_2 = Button(root, text="Option 2", command=Option_2_Function)
My_Button_2.pack(side=RIGHT)
root.mainloop()

所以我收到了这个错误。

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\jlabonte\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 1549, in __call__
    return self.func(*args)
  File "C:\Users\jlabonte\Desktop\test.py", line 22, in Delete_Label_Function
    My_Label_1.Destroy()
NameError: name 'My_Label_1' is not defined

我对编码很陌生,所以如果我错了,请告诉我。

1)我想创建一个具有许多不同选项按钮的第一个窗口。

2)然后,我想通过选择一个选项按钮创建第二个窗口,该按钮将有一个添加和删除按钮。

3)然后,我希望能够通过多次选择这些按钮来添加和删除标签到我的第二个窗口。

到目前为止我发现能够做到这一点的是为我的按钮创建一个函数,我可以使用command =调用。但由于变量只存在于它们所创建的函数中,因此我无法破坏不存在的函数。

那么如何才能使我的添加标签和删除标签按钮正常工作?

感谢。

2 个答案:

答案 0 :(得分:1)

您必须保留对每个标签的引用。您在Add_Label_Function()中创建的引用是本地的(仅在函数内),因此在函数退出时会进行垃圾回收。这是我坐的一个程序。它通过将按钮添加到字典来保持对按钮的引用。请注意,使用按钮和grid.forget()代替标签和销毁,但原理是相同的。

var app = angular.module('myApp', []);
app.controller('myCtrl', ['$scope', function($scope) {

  $scope.myMapByCmd = { "ONE": [ "my-one", "my-two", "my-three" ],                                              
                        "TWO": [ "my-one", "my-two", "my-three" ],
                        "THREE": [ "my-one", "my-two", "my-three" ]}
}]);

答案 1 :(得分:0)

使用:

 global My_Label_X 

使标签可用作变量,仅此而已

对于回答的人来说,简单得多;)