Tkinter变量观察者

时间:2019-05-08 12:34:44

标签: python tkinter

我试图根据观察者信息放置一个变量。然后,这个变量我希望在治疗中使用它,而不是显示它。

#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 个答案:

答案 0 :(得分:2)

首先,您将国家/地区变量视为全局变量,但事实并非如此。同样,在主循环之前也没有定义它。

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

这是一个开始。现在,尽管如此,您才可以要求打印国家(地区)。我建议您不要将“国家/地区”声明为全局变量,而只需从CountryChoice函数启动函数

喜欢

if int(obs) == 1:
        someFunction("United Kingdom")

答案 1 :(得分:1)

有几件事使问题中的代码无法正常工作。

发生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 - Style Guide for Python Code建议,尤其是关于Naming ConventionsCode Layout。这将使您的代码更易于使用和维护,也易于他人阅读。

与之类似,问题Best way to structure a tkinter application?的公认答案为tkinter专家提供了一些极好的建议,这些建议涉及构造tkinter应用程序的最佳方法,如果您遵循这些最佳方法,则无需使用大多数全局变量(被许多人认为是不好的编程习惯。