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

程序运行错误“ TypeError:'IntVar'和'int'的实例之间不支持'<'

可以理解,所以我需要使用 .get() 或 .getvar() 来检索变量内部的值self.Filter_Number = Filter_Num.get(),但是如果这样做,我会收到错误“ AttributeError:'int' object has no attribute 'get'

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

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

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

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

4

2 回答 2

0

您声称两者都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绝对会奏效。

于 2020-06-24T13:10:53.973 回答
0

在看到我的愚蠢错误后设法让它工作。错误是由于 GUI 类的初始化顺序造成的。监控 GUI 类在设置 GUI 屏幕之前开始,其中单选按钮变量被分组到 IntVar() 类中。通过更改它们在 MainView 类中初始化的顺序并运行第 1 个设置类(实际上是我的第 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

尽管实际错误与预期略有不同,而且是一个愚蠢的错误,但我会留下问题。

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

于 2020-06-29T11:50:48.623 回答