【问题标题】:Python tkinter checkbutton value not accessiblePython tkinter checkbutton 值不可访问
【发布时间】:2016-06-16 16:16:50
【问题描述】:

我想用 Python 构建一个小的 GUI 应用程序。目标是让一个主窗口调用其他几个窗口。在其中一个称为窗口的窗口中,我有一个复选按钮。我的问题是我无法读取此复选框的值,而我可以读取 Entry 小部件的值。我做错了什么?

    from tkinter import *
    import tkinter as tk


    class mainwindow():
        def __init__(self, master):

            self.master = master
            menubalk = Menu(self.master)

            menubalk.add_command(label="New window", command=self.openNewwindow)
            self.master.config(menu=menubalk)

        def openNewwindow(self):
            window = newwindow()
            window.mainloop()

    class newwindow(Tk):

        def __init__(self):
            Tk.__init__(self)

            self.var = BooleanVar()
            self.checkbutton = Checkbutton(self, text="Check", variable=self.var)
            self.checkbutton.grid(column=0, row=0)

            self.var2 = StringVar()
            self.entry = Entry(self, textvariable=self.var2)
            self.entry.grid(column=2,row=0)

            self.button2 = Button(self,text=u"Show", command=self.showValues).grid(column=1, row=0)

        def showValues(self):
            print('Value checkbutton:', self.var.get(), ';', 'Value entryfield: ', self.entry.get())

    def main():
        root = Tk()
        window = mainwindow(root)
        root.mainloop()

    if __name__ == '__main__':
        main()

【问题讨论】:

  • “无法读取值”是什么意思?拨打self.var.get()会得到什么?
  • 我总是得到 False,当检查按钮被选中时也是如此。
  • 你能尝试明确设置检查按钮的开和关值吗? (例如Checkbutton(self, text="Check", variable=self.var, onvalue=True, offvalue=False)
  • 试过了,结果一样。

标签: python checkbox tkinter


【解决方案1】:

您正在您的程序中创建多个独立的 Tkinter 应用程序。不要那样做。要创建新窗口,请使用 Toplevel 小部件。

from tkinter import *

class mainwindow():
    def __init__(self, master):

        self.master = master
        menubalk = Menu(self.master)

        menubalk.add_command(label="New window", command=self.openNewwindow)
        self.master.config(menu=menubalk)

    def openNewwindow(self):

        def showValues(var, entry):
            print('Value checkbutton:', var.get(), ';', 'Value entryfield: ', entry.get())

        window = Toplevel(self.master)
        var = BooleanVar()
        checkbutton = Checkbutton(window, text="Check", variable=var)
        checkbutton.grid(column=0, row=0)

        var2 = StringVar()
        entry = Entry(window, textvariable=var2)
        entry.grid(column=2,row=0)

        button2 = Button(window,text=u"Show", command=lambda: showValues(var, entry))
        button2.grid(column=1, row=0)

def main():
    root = Tk()
    window = mainwindow(root)
    root.mainloop()

if __name__ == '__main__':
    main()

【讨论】:

  • 运行此代码时,单击主窗口中的菜单项“新窗口”时出现错误:AttributeError: 'mainwindow' object has no attribute 'window'。
  • @Erwin - 抱歉,当我将其全部转换为局部变量时,我忘了更改它。它在函数的顶部被称为window,因此在函数的其余部分中它应该被称为window(而不是self.window)。
  • 对不起 Tigerhawkt3,这仍然无法正常工作。我收到一个错误:AttributeError: 'mainwindow' object has no attribute 'var'。
  • 我很抱歉;同样的问题和同样的解决方案。将self.var 更改为var 并将self.var2 更改为var2
【解决方案2】:

Tkinter 的变量对象(IntVar、StringVar 等)必须将参数“master”作为它们的第一个参数。即替换

self.var=StringVar()

self.var=StringVar(self)

或者

self.var=StringVar(master=self)

【讨论】:

  • 这不是导致问题的原因,根本没有必要,甚至在(非官方)documentation 中也不推荐。
猜你喜欢
  • 2018-05-17
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
相关资源
最近更新 更多