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

2024-09-30 10:35:35 发布

您现在位置:Python中文网/ 问答频道 /正文

最近我的代码中有一部分被卡住了,这对我来说似乎没有多大意义。我正忙于一个有多个屏幕的程序来监控一个水处理过程。在设置页面中,有单选按钮选项可与其他设置一起选择过滤器数量(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")

程序在'IntVar'和'int'实例之间运行错误“TypeError:'<;”

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

如果我理解正确,它要么告诉我它是一个IntVar,不能比较,要么告诉我它是一个整数,不能从中得到值。我错过什么了吗?我对这门语言相当陌生

更奇怪的是在if中使用IntVar时

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

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


Tags: textselfgetifvalueplacefiltervariable
2条回答

看到我的愚蠢的错误后,设法让它工作起来。这些错误是由于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

尽管实际错误与预期略有不同,而且是一个愚蠢的错误,但我将把这个问题留待讨论

回答=确保代码的运行顺序正确

您正在声明两个Filter_Num < 4都在抛出一个错误,声明Filter_Num是一个IntVar,并且Filter_Num.get()都在抛出一个错误,声明Filter_Num是一个int。这两个错误不可能都是真的

如果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绝对有效

相关问题 更多 >

    热门问题