如何在全局 space 中使用带有单选按钮的 IntVar 变量集的比较运算符?

How To Use Comparison Operator with IntVar Variables Set With Radio Buttons in global space?

最近卡在了我的代码的一部分,这对我来说似乎没有多大意义。我正忙于一个带有多个屏幕的程序来监控水处理过程。在设置页面中,有单选按钮选项 select 过滤器 (1-4) 的数量以及其他设置。 To Group These radio button Filter_Num = tk.IntVar() 被使用,然后值由4个Radio Buttons分配。

    Filt1=tk.Radiobutton(self, text = "1" ,variable=Filter_Num,value=1)
    Filt1.place(x=700,y=141)
    Filt2=tk.Radiobutton(self, text = "2" ,variable=Filter_Num,value=2)
    Filt2.place(x=750,y=141)
    Filt3=tk.Radiobutton(self, text = "3" ,variable=Filter_Num,value=3)
    Filt3.place(x=700,y=160)
    Filt4=tk.Radiobutton(self, text = "4" ,variable=Filter_Num,value=4)
    Filt4.place(x=750,y=160)

现在在另一个显示控制选项的页面上使用它我有一个显示输出状态的函数,它每 500 毫秒更新一次,黑色表示它被禁用,但是当使用比较运算符时

    if Filter_Num < 4:
        self.Filter4Can.itemconfigure(self.Filter_4i, fill="black") 
    elif (Filter_4_Solenoid == 1) and (Filter_Num >= 4):
        self.Filter4Can.itemconfigure(self.Filter_4i, fill="green")                     
    else:
        self.Filter4Can.itemconfigure(self.Filter_4i, fill="red")

程序运行错误“TypeError: '<' not supported between instances of 'IntVar' and 'int'

可以理解,所以我需要使用 .get() 或 .getvar() 来检索变量内的值,因此 self.Filter_Number = Filter_Num.get(),但如果这样做,我会得到错误“AttributeError:'int' 对象没有属性 'get'"

如果我理解正确,它要么告诉我它是一个 IntVar 并且无法比较,要么告诉我它是一个 Integer 并且无法从中获取值。我错过了什么吗?我对这门语言还很陌生。

更奇怪的是在这样的 if 中使用 IntVar

if Filter_4_Solenoid == 1:
   x = Filter_Num
   x = x.get()
   print(x)

值转换没有问题,我可以得到 1 - 4,但在 If 之外,问题仍然存在

你声称 Filter_Num < 4 抛出一个错误声明 Filter_Num 是一个 IntVar,而 Filter_Num.get() 抛出一个错误声明 Filter_Num是一个整数。不可能这两个都是真的。

如果 Filter_Num 真的像您声称的那样是 IntVar 的一个实例,您需要在表达式中使用它之前使用 .get() 方法获取值:

if Filter_Num.get() < 4:
    ...

毫无疑问,这就是您在表达式中使用 IntVar 实例的方式。

如果抛出错误 "AttributeError:'int' object has no attribute 'get'",唯一可能的解释是 Filter_Num 是一个 int,因为错误告诉你它是一个 int。如果这是真的,那么 if Filter_Num < 4 绝对有效。

在看到我的 愚蠢的 错误后设法让它工作。错误是由于 GUI Classes 的初始化顺序造成的。监控 GUI 类 在设置 GUI 屏幕之前启动,其中单选按钮变量被分组到 IntVar() 类。这是通过更改它们在 MainView Class 中初始化的顺序和 运行 设置 Class(实际上是我的第 6 页)第一。简化的代码现在看起来像这样。

global Filter_Num = 2 #Initial Junk integer

Class Page4(page):                          ##IO Page##
    def __init__(self, *args, **kwargs):
        Page.__init__(self, *args, **kwargs)
        self.Create_IO_Widgets()
        self.IO_Updater()

    def Create_IO_Widgets(self):
        self.Filter2Can = tk.Canvas(self, width=30, height=30, bg="DarkOrange1")
        self.Filter2i = self.Filter2Can.create_oval(2,2,28,28,fill="red")
        self.Filter2Can.place(x=200,y=200)

    def Update_IO_Reading(self):
        if (Filter_Num.get()<2):
            self.Filter2Can.itemconfigure(self.Filter2i, fill="black")
        else:
            self.Filter2Can.itemconfigure(self.Filter2i, fill="red")

    def IO_Updater(self):
        self.Update_IO_Reading()
        self.after(500, self.IO_Updater)
           

Class Page6(Page):                          ##Setup Page##
    def __init__(self, *args, **kwargs):
        Page.__init__(self, *args, **kwargs)
        self.Create_Setup_Widgets()

    def Create_Setup_Widget(self)
        global Filter_Num               #Global declared in function so that Change can be made

        Filter_Num = tk.IntVar(Value=#) #Actual initial read value can be changed in here

        Filt1= tk.Radiobutton(self, text="1", variable=Filter_Num, value=1)
        Filt1.place(x=100,y=100)
        Filt2= tk.Radiobutton(self, text="2", variable=Filter_Num, value=2)
        Filt2.place(x=120,y=100)

Class MainView(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        

        p6 = Page6(self);p4 = Page4(self) #Initializing Order Changed to prevent incorrect initial readings

虽然实际错误与预期略有不同,但我会留下这个问题,这是一个愚蠢的错误。

答案 = 确保您的代码 运行 的顺序是正确的