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

Python 如何在全局空间中使用带有单选按钮的IntVar变量集的比较运算符?,python,tkinter,thonny,Python,Tkinter,Thonny,最近我的代码中有一部分被卡住了,这对我来说似乎没有多大意义。我正忙于一个有多个屏幕的程序来监控一个水处理过程。在设置页面中,有单选按钮选项可与其他设置一起选择过滤器数量(1-4)。要对这些单选按钮进行分组,请使用Filter_Num=tk.IntVar(),然后通过4个单选按钮分配值 Filt1=tk.Radiobutton(self, text = "1" ,variable=Filter_Num,value=1) Filt1.place(x=700,y=1

最近我的代码中有一部分被卡住了,这对我来说似乎没有多大意义。我正忙于一个有多个屏幕的程序来监控一个水处理过程。在设置页面中,有单选按钮选项可与其他设置一起选择过滤器数量(1-4)。要对这些单选按钮进行分组,请使用
Filter_Num=tk.IntVar()
,然后通过4个单选按钮分配值

    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")

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

您声称这两个
Filter\u Num<4
都抛出了一个错误,声称
Filter\u Num
是一个
IntVar
,并且
Filter\u Num.get()
正在抛出一个错误,声称
Filter\u Num
为int。这两个值不可能都为true

如果
Filter\u Num
确实是
IntVar
的一个实例,您需要使用
.get()
方法在表达式中使用该值之前获取该值:

if Filter_Num.get() < 4:
    ...
if Filter_Num.get()<4:
...
毫无疑问,这就是在表达式中使用
IntVar
实例的方式


如果抛出错误
“AttributeError:'int'对象没有属性'get'”
,唯一可能的解释是
Filter\u Num
int
,因为错误告诉您它是
int
。如果这是真的,那么如果Filter_Num<4绝对可以工作。

在看到我的愚蠢的错误后,设法让它工作。这些错误是由于GUI类的初始化顺序造成的。监控GUI类在设置GUI屏幕之前启动,其中单选按钮变量被分组为IntVar()类。通过更改它们在MainView类中初始化的顺序并首先运行Setup类(实际上是我的第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
global Filter_Num=2#初始垃圾整数
班级第4页(第页):##IO页##
定义初始化(self,*args,**kwargs):
第页.uuu初始(self,*args,**kwargs)
self.Create_IO_Widgets()
self.IO_更新程序()
def创建IO小部件(自):
self.Filter2Can=tk.Canvas(self,宽度=30,高度=30,bg=“DarkOrange1”)
self.Filter2i=self.Filter2Can.create_oval(2,2,28,28,fill=“red”)
自过滤器2可放置(x=200,y=200)
def更新IO读取(自):

如果(Filter_Num.get()使用
Filter_Num.get()
。@acw1668感谢您的回答,但如最后第二段所述,在IntVar上使用.get()会导致“AttributeError:'int'对象没有属性'get'”这意味着代码中的某个地方已将其更改为int类型。@acw1668是一个全局变量,仅在设置页中指定了它的值。在代码中的其他任何地方都不会更改它。(编辑文章)很明显,你没有在别处赋值是错误的;如果这是真的,你就不会得到这个错误。谢谢你的回复。有两个屏幕截图显示了这两种情况。在我对另一条评论的回复中,我可以在if语句中得到值,而不是在它之外。这就是为什么这很奇怪。尽管如此,我不会把它放在我过去在某个地方犯了一个愚蠢的错误,但是这个变量没有在其他任何地方使用。@Yumcum777:一个不变的事实是,这个变量不能同时是
int
IntVar
的一个实例。它必须是一个或另一个。如果它在一点上是一个,在另一点上是另一个,唯一可能的结论是ion是有东西改变了它。你是100%正确的,这就是为什么我感到困惑,但希望它能被解决。所以单选按钮将全局指定为IntVar,这意味着我可以使用代码中的任何地方。get()检索该值。当使用或为其分配新值时,问题会出现,它会更改为Int,这意味着不需要.get()。有没有办法将该值转换回IntVar?就像使用Int()一样?@YuMChUM777:tkinter不会将其从
IntVar
更改为
int
。您的代码一定在某个地方执行了此操作。我认为在设置页面上用“Filter_Num=tk.IntVar()”将单选按钮分组,并初始化其监视的其他页面时会出现问题。get()'在初始启动时给出错误,因为Filter_Num在全局空间'Filter_Num=3'处被分配了一个int。但是在设置屏幕上,它被更改为一个IntVar以对tkinter单选按钮进行分组,并且该IntVar被分配了它的值(1-4)。因此,如果.get()在开始时尝试读取初始“3”,而不是“1-4”将插入单选按钮的PY_VAR中。
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