TKInter checkbox变量始终为0

2024-10-03 23:23:37 发布

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

我使用Python的TkInter模块作为GUI。下面是一个简单的复选框代码。在

def getCheckVal():
    print cbVar.get()

windowTime=Tk.Tk()
cbVar = Tk.IntVar()
btnC = Tk.Checkbutton(windowTime, text="Save", variable = cbVar, command=getCheckVal)
btnC.grid()
windowTime.mainloop()

这个代码工作正常。每次我勾选复选框,我得到1,否则为0。在

但是,当我在从另一个TkInter命令调用的函数中运行相同的代码时(当按下按钮时),它将停止工作。我总是取0作为值。在

^{pr2}$

这很不寻常。会出什么问题?在

编辑:我使用了2个主循环,因为我希望在单击“显示绘图”按钮时打开一个单独的窗口(windowTime)。这个新窗口应该有复选框。在


Tags: 模块代码gettkinterdefgui按钮tk
2条回答

您的windowTimecbVar等变量在函数的局部作用域中定义。当askUser()完成执行时,这些值将被丢弃。在它们前面加上self.,将它们保存为实例变量。在

程序中应该只有一个mainloop(),以运行主Tkinter根对象。试着把它放在程序的最后一行。我建议您阅读一下Effbot,了解如何设置Tkinter应用程序。在

我不确定您要做什么,但有一个问题是,您在askUser()方法中创建的名为cbVarTK.IntVar将在函数返回时被删除,因此您需要将其附加到某个在该函数返回后仍然存在的东西上。虽然可以将其作为全局变量,但更好的选择是使其成为更持久的属性,并且“寿命”更长。在

另一个可能的问题是,在一个Tkinter应用程序中,通常只应该有一个对mainloop()的调用。看来您要做的是显示通常称为对话框窗口,Tkinter也支持它。有一些标准的内置类,加上一些更通用的类来简化自定义类的创建。这里有一些我发现的documentation详细描述了它们。您可能还发现查看它们的源代码很有帮助。 在python2中,它位于/Lib/lib-tk/tkSimpleDialog.py文件中,并且 在python3中,代码位于一个名为/Lib/tkinter/simpledialog.py的文件中。在

下面的代码采用后一种方法,并从包含Tkinter库的通用类派生一个名为GUIButtonDialog的自定义对话框类,该类仅名为Dialog。在

try:
    import Tkinter as Tk    # Python 2
    from tkSimpleDialog import Dialog
except ModuleNotFoundError:
    import tkinter as Tk    # Python 3
    from tkinter.simpledialog import Dialog


class GUIButtonDialog(Dialog):
    """Custom one Button dialog box."""
    def __init__(self, btnText, parent=None, title=None):
        self.btnText = btnText
        Dialog.__init__(self, parent, title)

    def getCheckVal(self):
        print(self.cbVar.get())

    def body(self, master):
        """Create dialog body."""
        self.cbVar = Tk.IntVar()
        self.btnC = Tk.Checkbutton(master, text=self.btnText, variable=self.cbVar,
                                   command=self.getCheckVal)
        self.btnC.grid()

        return self.btnC  # Return the widget to get inital focus.

    def buttonbox(self):
        # Overridden to suppress default "OK" and "Cancel" buttons.
        pass


class GUIMainClass:

    def __init__(self):
        """Create the main window."""
        self.window = Tk.Tk()

    def askUser(self):
        """Display custom dialog window (until user closes it)."""
        GUIButtonDialog("Save", parent=self.window)

    def cmdWindow(self):
        frameShow = Tk.Frame(self.window)
        frameShow.grid()
        btnSwitch = Tk.Button(frameShow, text='Show Plots', command=self.askUser)
        btnSwitch.grid()
        self.window.mainloop()


GUIObj = GUIMainClass()
GUIObj.cmdWindow()

相关问题 更多 >