【问题标题】:Tkinter Checkbutton not workingTkinter Checkbutton 不起作用
【发布时间】:2018-10-20 22:03:58
【问题描述】:

我知道这似乎是一个愚蠢的问题,但我已经阅读了我能找到的所有相关/类似问题,并且我很确定我遇到了不同的问题。有关我已避免的类似问题的列表,请参阅此问题的结尾。

我正在尝试使用 Tkinter Checkbutton。我几乎一字不差地使用了文档 (here) 中的示例代码。

from tkinter import Tk, Checkbutton, IntVar
class MyGUI:
    def __init__(self, window):
        self.var = IntVar()
        self.c = Checkbutton(window, 
                             text="Enable Tab",
                             variable=self.var,
                             command=self.cb)
        self.c.pack()

    def cb(self):
        print("self.var is", self.var.get())

root = Tk()
gui = MyGUI(root)
root.mainloop()
root.destroy()

我唯一改变的是从 cb 方法中删除 event 参数,因为据我所知它没有被用于任何事情,并且检查按钮没有通过任何 eventcb

我的问题是存储检查按钮值的变量总是读取0,即使检查了检查按钮:

我不知道我做错了什么。我知道我已经避免了以下陷阱:

另外,当我从a question with a similar issue 运行代码时,我得到相同的行为——复选框总是返回 False/0——即使该问题被标记为已解决。

我正在使用以下版本的 Anaconda python:

Python 3.5.4 |Anaconda custom (64-bit)| (default, Nov  8 2017, 14:34:30) 
[MSC v.1900 64 bit (AMD64)]
IPython 6.2.1 -- An enhanced Interactive Python.

【问题讨论】:

  • 我在 3.2 python,Tk 版本 8.5 中得到了预期的输出
  • 请附上您的进口声明。我们无法确定您使用的是 tkinter Checkbutton 还是 ttk Checkbutton。
  • @BryanOakley 谢谢,将导入语句添加到问题中。
  • 那个小视频中的代码与您问题中发布的代码不同。至少有一个区别是此代码使用self.c,而视频中的代码仅使用c。我认为这并不重要,但您需要确保发布的代码准确反映了您的真实代码。
  • 您问题中的代码不会运行。导入语句有语法错误。请提供您在系统上运行的实际代码。不过,即使我解决了这个问题,代码对我来说也能正常工作。

标签: python user-interface button tkinter


【解决方案1】:

如果有人遇到同样的问题并需要快速修复,这是我的 hacky 解决方案:

from tkinter import Tk, Checkbutton, IntVar
class MyGUI:
    def __init__(self, window):
        self.var = IntVar()
        self.c = Checkbutton(
            window, text="Enable Tab",
            command=lambda:self.toggle(self.var))
        self.c.pack()

    def toggle(self, var):
        var.set(not var.get())

root = Tk()
gui = MyGUI(root)
root.mainloop()

【讨论】:

  • 删除最后一行。 root.destroy()。这里没有意义,当你的程序关闭时会抛出错误。
【解决方案2】:

您的代码对我有用。

也许尝试从 Tkinter* 导入所有内容并删除最后一行。但我认为你的问题是 anaconda 错误。

from tkinter import *
class MyGUI:
    def __init__(self, window):
        self.var = IntVar()
        self.c = Checkbutton(window, 
                             text="Enable Tab",
                             variable=self.var,
                             command=self.cb)
        self.c.pack()

    def cb(self):
        print("self.var is", self.var.get())

if __name__ == "__main__":
    root = Tk()
    gui = MyGUI(root)
    root.mainloop()

【讨论】:

  • 感谢@Turjak_art 的努力。恐怕还是没有运气。
【解决方案3】:
chkValue = BooleanVar(root) 
chkValue.set(True)

chk = Checkbutton(root, text=' Remember Password',var=chkValue) 
chk.grid(column=1,row=3,sticky=W)

使用大师

  • BooleanVar(主)
  • IntVar(主)
  • StringVar(主)

【讨论】:

    【解决方案4】:

    这是我的解决方案,我必须这样做 您在内部调用并从主文件导入并使用该类时遇到了同样的问题

    from tkinter import Tk, Checkbutton, IntVar
    class MyGUI:
        def __init__(self, window):
            self.var = IntVar()
            self.c = Checkbutton(window, 
                                 text="Enable Tab",
                                 variable=self.var,
                                 command=self.cb)
            self.c.pack()
    
        def cb(self):
            if self.var.get() == 0:
               self.var.set(1)
            else:
               self.var.set(0)
            print("self.var is", self.var.get())
    
    root = Tk()
    gui = MyGUI(root)
    root.mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-29
      • 2016-02-16
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 2020-04-07
      相关资源
      最近更新 更多