Невозможно изменить глобальную метку в Tkinter python

#python #tkinter #tkinter-label

Вопрос:

Я просто пытаюсь создать Radiobutton графический интерфейс с помощью tkinter . В котором я хочу изменять/заменять «Выберите начинки» Label ( myLabel ) каждый раз, когда пользователь выбирает что-либо Radiobutton с таким Radiobutton именем. Итак, ошибка, с которой я сталкиваюсь, заключается в том, что вместо замены этой метки новая метка создается чуть ниже, хотя я использую глобальную Label .

 from tkinter import *  root = Tk()  Toppings = [  ["Pepperoni", "Pepperoni"],  ["Cheese", "Cheese"],  ["Mushroom", "Mushroom"],  ["Onion", "Onion"] ]  pizza = StringVar() pizza.set("Select your toppings")  for topping, value in Toppings:  Radiobutton(root, text = topping, variable = pizza, value = value). pack(anchor = W)  myLabel = Label(root, text = pizza.get()) myLabel.pack()  def clicked(value):  global myLabel  myLabel.grid_forget()  myLabel = Label(root, text = value)  myLabel.pack()   myButton = Button(root, text="CLick me!", command = lambda: clicked(pizza.get())) myButton.pack()    root.mainloop()  

Изображение вывода моего кода находится здесь

Ответ №1:

Используйте .config для настройки определенного параметра виджета (и в любом случае не нужно использовать global в этом случае) (и объяснение того, почему перезапись не сработала, заключается в том, что вам нужно удалить его из Tcl вызова .destroy , если вы хотите сделать это таким образом, но в этом нет необходимости):

 def clicked(value):  myLabel.config(text=value)  

Также я бы предложил следовать PEP 8 и не иметь места вокруг = , если он используется в аргументах ключевых слов, также должны быть имена переменных snake_case . И не используйте * при импорте модуля, импортируйте только то, что вам нужно.

Дальнейшие улучшения:

 from tkinter import Tk, Label, Radiobutton, StringVar  toppings = [  "Pepperoni",  "Cheese",  "Mushroom",  "Onion" ]  root = Tk()  topping_var = StringVar(value='Select your topping')  for topping in toppings:  Radiobutton(root, text=topping, variable=topping_var, value=topping).pack(anchor='w')  myLabel = Label(root, textvariable=topping_var) myLabel.pack()   root.mainloop()  

Вам не нужно использовать кнопку, просто установите переменную как textvariable для Label , и все