Я хочу добавлять и удалять метки в рамке окна верхнего уровня, нажимая кнопки.

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 =. Но поскольку переменные существуют только в функциях, в которых они были созданы, я не могу уничтожить то, чего не существует.

Итак, как мне заставить мои кнопки добавления меток и удаления меток работать правильно?

Спасибо.

0
GrandJoss 24 Фев 2016 в 22:56

2 ответа

Лучший ответ

Вы должны иметь ссылку на каждую этикетку. Ссылки, которые вы создаете в Add_Label_Function (), являются локальными (только внутри функции), поэтому при выходе из функции они собираются сборщиком мусора. Это программа, которую я сидел без дела. Он сохраняет ссылку на кнопки, добавляя ее в словарь. Обратите внимание, что вместо меток и уничтожения используются кнопки и grid.forget (), но принцип тот же.

from Tkinter import *
from functools import partial

class ButtonsTest:
   def __init__(self):
      self.top = Tk()
      self.top.title("Click a button to remove")
      self.top_frame = Frame(self.top, width =400, height=400)
      self.button_dic = {}
      self.buttons()
      self.top_frame.grid(row=0, column=1)

      Button(self.top_frame, text='Exit', bg="orange",
             command=self.top.quit).grid(row=10,column=1, columnspan=5)

      self.top.mainloop()

   ##-------------------------------------------------------------------.........
   def buttons(self):
      b_row=1
      b_col=0
      for but_num in range(1, 11):
         ## create a button and send the button's number to
         ## self.cb_handler when the button is pressed
         b = Button(self.top_frame, text = str(but_num),.
                    command=partial(self.cb_handler, but_num))
         b.grid(row=b_row, column=b_col)
         ## dictionary key=button number --> button instance
         self.button_dic[but_num] = b

         b_col += 1
         if b_col > 4:
            b_col = 0
            b_row += 1

   ##----------------------------------------------------------------
   def cb_handler( self, cb_number ):
      print "\ncb_handler", cb_number
      self.button_dic[cb_number].grid_forget()

##===================================================================
BT=ButtonsTest()
1
user4171906user4171906 24 Фев 2016 в 23:10

Использование:

 global My_Label_X 

Сделать ваши ярлыки доступными как переменные, и все

А тому, кто ответил, проще тем больше;)

0
Juan Martin Castro 19 Июл 2020 в 10:28