На холсте есть кнопка «новая запись», которая запускает Toplevel. Он имеет кнопку отправки, кнопку отмены, OptionMenu и метку. Цель состоит в том, что выбранное значение из OptionMenu изменяет текст метки. Я не добавил код для холста.tkinter: отредактируйте текст меток, основанный на измененном OptionMenu
def Test(value):
p = value
print(p) # a test
E2.config(text=str(p))
def Vullen_Toplevel_Aankoop_EUR(i):
top = Toplevel()
top.geometry("%dx%d%+d%+d" % (600, 800, 250, 125))
BSubmit = Button(top, text="Submit", fg='green')
BSubmit.grid(row=1, column=0, sticky="ew", columnspan=1, padx=20)
BCancel = Button(top, text="Cancel", fg='red', command=top.destroy)
BCancel.grid(row=10, column=0, sticky="ew", columnspan=1, padx=20)
p = None
E2 = None
E1_opt = ["A","B","C"]
E1_var = StringVar(top)
E1_var.set(E1_opt[0])
W1 = OptionMenu(top, E1_var, *E1_opt, command=Test)
W1.grid(row=2, column=1, sticky="ew")
E2 = Label(top, text='test')
E2.grid(row=4, column=2, sticky="ew")
Значение по умолчанию переменной p равно «пусто». Параметр OptionMenu запускает команду = Test, которая печатает новое значение для p на консоли. Все идет нормально.
Я попытался обновить Label E2 с помощью E2.config (test = str (p)). К сожалению, сообщение об ошибке:
NameError: name 'E2' is not defined
Хотя не добавил в код здесь, я попробовал следующее:
- Определение E2 Этикетка как «пустой» или в качестве ярлыка чуть ниже, где я определил «р» , ошибка такая же.
- Определите метку E2 в тесте def (значение), но здесь, конечно, ошибка заключается в том, что верхний уровень Toplevel() не определен.
- Вместо команды = Тест Я попробовал команду = лямбда: Test (top, E1_var.get()) и изменил метод тестирования на def Test (верхний, значение), но затем ошибка: TypeError:() принимает 0 позиционных аргументы, но 1 дано
Я из идей. У вас есть идеи поделиться? Благодарю.
'E2' является локальной переменной, которая существует только в одной функции. Определите его вне любой функции - т.е. 'E2 = None', и тогда у вас будет глобальная переменная. А затем вы можете сообщить функции для использования этой переменной с помощью 'global E2' внутри' Vullen_Toplevel_Aankoop_EUR' (потому что вы используете '=' для назначения значения). В 'Test' вам не нужно использовать' global E2', потому что вы не используете '=', и он будет использовать внешний 'E2' автоматически. – furas
@furas Честно говоря, я не понимаю, подтвердил подход или нет. И p и E2 определены в Vullen_Toplevel_Aankoop_EUR (теперь как = Нет, обновлен пример кода) и могут принимать с помощью [=] в тесте значение переменной [значение]. Но все еще E2, как определено Button, позже установленный в Vullen_Toplevel_Aankoop_EUR, еще не определен в Test. Я переместил определение E2 = None вне функции Toplevel(), но результат не изменился. Возможно, вы уточните свое заявление немного больше. Благодарю. –
read commend again: define 'E2 = None' ** ВНЕШНИЕ ФУНКЦИИ ** - и использовать' global E2' ** INSIDE FUNCTIONS **. – furas