Tkinter Variable Observer - PullRequest
       3

Tkinter Variable Observer

1 голос
/ 08 мая 2019

Я пытался поставить переменную в соответствии с информацией наблюдателя.Затем эту переменную я хочу использовать в обработках, а не отображать.

#coding:utf-8
import tkinter

app = tkinter.Tk()

def CountryChoice(*args):
   if observer.get() == 0:
       Country = "France"
   if observer.get():
       Country = "United Kingdom"

observer = tkinter.StringVar()
observer.trace("w", CountryChoice)

FranceRadio = tkinter.Radiobutton(app, text="France", value=0, variable=observer)
UKRadio = tkinter.Radiobutton(app, text="UK", value=1, variable=observer)

FranceRadio .grid(row=0, column=0)
UKRadio .grid(row=0, column=1)

#def treaitement():
   #i would like to reuse the variable Country here but I can not get it.

print(Country)  #==> NameError: name 'Country' is not defined

app.mainloop()

Цель состоит в том, чтобы извлечь переменную Country, когда пользователь помещает мышь на кнопку.Следующая цель - добавить кнопку запуска, которая будет запускать процесс, который зависит от выбора переключателя.Но я не могу получить переменную Country.

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Для начала, вы рассматриваете переменную вашей страны как глобальную, но это не так.Также он не определен до основного цикла.

def CountryChoice(*args):
    global Country
    obs = observer.get()
   if int(obs) == 0:
        Country = "France"
    if int(obs) == 1:
        Country = "United Kingdom"

Это начало.Теперь вы не можете попросить напечатать страну, пока она не будет определена.Я предлагаю вам не объявлять 'Country' глобальной, а просто запускать свои функции из вашей CountryChoice функции

Like

if int(obs) == 1:
        someFunction("United Kingdom")
1 голос
/ 08 мая 2019

Есть несколько вещей, препятствующих работе кода в вашем вопросе.

NameError происходит, потому что глобальная переменная Country не существует, когда выполняется вызов print(Country).Это можно исправить, просто предварительно определив переменную - возможно, где-то в начале скрипта.

С этой проблемой связан тот факт, что в функции CountryChoice(), Country считается локальнойпеременная, поэтому установка ее значения не влияет на глобальную переменную с тем же именем.Это можно исправить, объявив переменную равной global в начале функции.

Наконец, при использовании виджетов Radiobutton тип опции value должен соответствовать типу переменной tkinter, являющейсяиспользуемый.В данном случае значения являются целыми числами, поэтому я изменил тип переменной observer с tk.StringVar на tk.IntVar.

Я внес эти изменения и добавил вызов функции treatment()до конца функции CountryChoice() для печати текущего значения при каждом вызове.

#coding:utf-8
import tkinter as tk

app = tk.Tk()

Country = None  # Declare global variable.

def CountryChoice(*args):
    global Country

    if observer.get() == 0:
        Country = "France"
    elif observer.get() == 1:
        Country = "United Kingdom"

    treatment()  # Use current value of Country.

observer = tk.IntVar()  # Use IntVar since Radiobutton values are integers.
observer.trace("w", CountryChoice)

FranceRadio = tk.Radiobutton(app, text="France", variable=observer, value=0)
UKRadio = tk.Radiobutton(app, text="UK", variable=observer, value=1)

FranceRadio.grid(row=0, column=0)
UKRadio.grid(row=0, column=1)

def treatment():
    # Reuse the variable Country.
    print(Country)

app.mainloop()

В заключение я хотел бы сделать несколько предложений. Я настоятельно предполагаю, чтоВы читаете и начинаете следовать рекомендациям PEP 8 - Руководство по стилю для кода Python , в частности, разделам о Соглашениях по именованию и Макет кода .Это облегчит работу с вашим кодом и его поддержку, а также его будет легче читать другим.

Аналогично, принятый ответ на вопрос Лучший способ структурировать приложение tkinter? имеетнекоторые отличные предложения от эксперта tkinter о наилучшем способе структурирования приложений tkinter, которые, если бы вы следовали им, исключали необходимость использования большинства глобальных переменных (которые многие считают плохой практикой программирования).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...