2017-01-23 2 views
0

На холсте есть кнопка «новая запись», которая запускает 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 дано

Я из идей. У вас есть идеи поделиться? Благодарю.

+0

'E2' является локальной переменной, которая существует только в одной функции. Определите его вне любой функции - т.е. 'E2 = None', и тогда у вас будет глобальная переменная. А затем вы можете сообщить функции для использования этой переменной с помощью 'global E2' внутри' Vullen_Toplevel_Aankoop_EUR' (потому что вы используете '=' для назначения значения). В 'Test' вам не нужно использовать' global E2', потому что вы не используете '=', и он будет использовать внешний 'E2' автоматически. – furas

+0

@furas Честно говоря, я не понимаю, подтвердил подход или нет. И p и E2 определены в Vullen_Toplevel_Aankoop_EUR (теперь как = Нет, обновлен пример кода) и могут принимать с помощью [=] в тесте значение переменной [значение]. Но все еще E2, как определено Button, позже установленный в Vullen_Toplevel_Aankoop_EUR, еще не определен в Test. Я переместил определение E2 = None вне функции Toplevel(), но результат не изменился. Возможно, вы уточните свое заявление немного больше. Благодарю. –

+0

read commend again: define 'E2 = None' ** ВНЕШНИЕ ФУНКЦИИ ** - и использовать' global E2' ** INSIDE FUNCTIONS **. – furas

ответ

0

Создать глобальную переменную вне всех функций

E2 = None 

Используйте global E2 сообщить функцию, чем вы хотите присвоить значение глобальной/внешней переменной E2. Без global он создаст локальную переменную E2 и не будет присвоен глобальной.

def Vullen_Toplevel_Aankoop_EUR(i): 
    global E2 # you need it because you use `E2 = ...` 

    E2 = Label(top, text='test') 

Полное

# create global variable 
E2 = None 

def Test(value): 
    #global E2 # you don't need it because you don't use `E2 = ...` 

    E2.config(text=value) 

def Vullen_Toplevel_Aankoop_EUR(i): 
    global E2 # you need it because you use `E2 = ...` 

    E2 = Label(top, text='test') 

# you can create also after functions 
#E2 = None 

КСТАТИ: короче

top.geometry("600x800+250+125") 
+0

Правильно! Я читал об определении глобальных переменных, но, по-видимому, я не понимал, что на самом деле мне нужно было определить «глобальный». Благодарю. –