【问题标题】:Python tkinter IntVars not being set properlyPython tkinter IntVars 未正确设置
【发布时间】:2017-06-16 13:19:14
【问题描述】:

我正在使用 Python 编写一个 tkinter 程序,该程序使用四个单选按钮和一个复选按钮。该项目同时利用了 GUI 窗口和命令行窗口。该代码应该创建按钮,在框中显示命令,等待几秒钟,然后根据已按下或未按下的按钮执行某些操作。

这是我创建按钮的代码 -

def __button1__(self):

    radiovar = tkinter.IntVar()

    check1var = tkinter.IntVar()

    radiovar.set(0)

    check1var.set(0)

    self.frame1 = tkinter.Frame(self.main_window)

    radio1 = tkinter.Radiobutton(self.frame1, text = 'Fire', variable = radiovar, value = 1)

    radio2 = tkinter.Radiobutton(self.frame1, text = 'Earth', variable = radiovar, value = 2)

    radio3 = tkinter.Radiobutton(self.frame1, text = 'Air', variable = radiovar, value = 3)

    radio4 = tkinter.Radiobutton(self.frame1, text = 'Water', variable = radiovar, value = 4)

    check1 = tkinter.Checkbutton(self.frame1, text = 'Shadow', variable = check1var,)

    radio1.pack()

    radio2.pack()

    radio3.pack()

    check1.pack()

    radio4.pack()

    self.frame1.pack(side = 'left')

    self.frame1.after(100, self.__game__)

这是创建 GUI 的类的一部分。最后一行等待一秒钟,然后启动执行程序其余部分的函数。功能是 -

def __game__(self):

    print('Select Shadow, then click on Water.')
    self.frame1.after(500)
    if check1var.get() == 1 and radiovar.get() == 4:
        print('Nicely done!')

创建窗口,第二次通过,然后我得到一个异常,说 check1var(与复选框一起使用的 IntVar)未定义。我发现我在设置或检查 IntVar 时做错了 - 我做错了什么,我该如何解决?

【问题讨论】:

  • check1var 定义在 __button1__ 的范围内 - 一旦 __button1__ 完成,它的引用就会丢失
  • 如何将check1var的范围扩大到game

标签: python tkinter


【解决方案1】:

要在一个类的多个函数中使用一个变量,你必须将它们声明为类的属性,这意味着用self.varname = var定义它们 让他们喜欢self.varname:

def __button1__(self):

    self.radiovar = tkinter.IntVar()

    self.check1var = tkinter.IntVar()

    self.radiovar.set(0)

    self.check1var.set(0)

    self.frame1 = tkinter.Frame(self.main_window)

    radio1 = tkinter.Radiobutton(self.frame1, text = 'Fire', variable = self.radiovar, value = 1)

    radio2 = tkinter.Radiobutton(self.frame1, text = 'Earth', variable = self.radiovar, value = 2)

    radio3 = tkinter.Radiobutton(self.frame1, text = 'Air', variable = self.radiovar, value = 3)

    radio4 = tkinter.Radiobutton(self.frame1, text = 'Water', variable = self.radiovar, value = 4)

    check1 = tkinter.Checkbutton(self.frame1, text = 'Shadow', variable = check1var,)

    radio1.pack()

    radio2.pack()

    radio3.pack()

    check1.pack()

    radio4.pack()

    self.frame1.pack(side = 'left')

    self.frame1.after(100, self.__game__) 

和:

def __game__(self):

    print('Select Shadow, then click on Water.')
    self.frame1.after(500)
    if self.check1var.get() == 1 and self.radiovar.get() == 4:
        print('Nicely done!')

【讨论】:

    【解决方案2】:

    假设这些方法是同一个类的一部分,使用self 使它们成为实例的属性,以便可以在所有方法中访问它们。

    def __button1__(self):
        self.radiovar = tkinter.IntVar()
        self.check1var = tkinter.IntVar()
        self.radiovar.set(0)
        self.check1var.set(0)
        # ... define buttons using self.checkvar and self.radiovar
    
    def __game__(self):
        print('Select Shadow, then click on Water.')
        self.frame1.after(500)
        if self.check1var.get() == 1 and self.radiovar.get() == 4:
            print('Nicely done!')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多