2016-03-03 78 views
0

我想在Python中构建一个小的GUI应用程序。目标是让一个主窗口调用其他几个窗口。在这些所谓的窗口之一,我有一个checkbutton。我的问题是我无法读取这个checkbutton的值,而我可以读取Entry小部件的值。我究竟做错了什么?Python tkinter checkbutton值不可访问

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() 
+0

你所说的 “无法读取值” 是什么意思?当你调用'self.var.get()'时你会得到什么? – acdr

+0

我也总是得到False,同时检查checkbutton。 – Erwin

+0

您可以尝试明确设置检查按钮的开启和关闭值吗? (例如,Checkbutton(self,text =“Check”,variable = self.var,onvalue = True,offvalue = False)') – acdr

回答

2

您正在程序中创建多个单独的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() 
+0

当我运行这段代码时,当我在主窗口中点击菜单项'New window'时出现错误:AttributeError:'mainwindow'对象没有属性'window'。 – Erwin

+0

@Erwin - 对不起,我忘了改变它,当我把它全部变成局部变量。它在函数的顶部被称为'window',所以在函数的其余部分(不是'self.window')应该被称为'window'。 – TigerhawkT3

+0

对不起Tigerhawkt3,这仍然无法正常工作。我收到一个错误:AttributeError:'mainwindow'对象没有属性'var'。 – Erwin

-1

Tkinter的的可变对象(IntVar,STRINGVAR等)必须采取参数 “主” 作为其冷杉参数。即更换

self.var=StringVar() 

随着

self.var=StringVar(self) 

或者

self.var=StringVar(master=self) 
+0

这不是造成问题的原因,完全没有必要,甚至在(非官方)[文档](http://effbot.org/tkinterbook/variable.htm)中都没有推荐。 – TigerhawkT3

相关问题