2016-09-28 53 views
0

我目前正在编写一个使用Tkinter为用户提供图形界面的应用程序。Tkinter复选框“名称未定义”

该应用程序运行良好,最近我决定添加一些复选框,这个想法是当用户选中其中一个框时,另一组文本通过API发送。

我有我能够得到很好地工作,但由于某种原因,每当我尝试和检索复选框的值输入框,我得到以下错误:

 if check.get(): 
NameError: name 'check' is not defined 

对于生活我无法弄清楚为什么会出现这个错误,这里是我的代码的其余部分,为了使它更清晰,我删除了输入框的工作代码。

from tkinter import * 

class GUI: 
    def __init__(self, master): 
     check = IntVar() 



     self.e = Checkbutton(root, text="check me", variable=check) 
     self.e.grid(row=4, column=2) 

     self.macro_button = Button(master, text="Test Button", command=self.test) 
     self.macro_button.grid(row=11, column=1) 



     def test(self): 
      if check.get(): 
       print('its on') 
      else: 
       print('its off') 



root = Tk() 
root.resizable(width=False, height=False) 
my_gui = GUI(root) 
root.mainloop() 

当运行该代码,然后按标有“测试按钮”按钮,即当误差出现在我的终端。

任何人都有任何想法为什么这发生在我的复选框,而不是我的inputboxes?

编辑:

什么是对我来说更奇怪的是,这个代码,我发现在网上进行教你如何使用Tkinter的复选框的工作就像一个魅力,它几乎等同于雷:

import tkinter as tk 

root = tk.Tk() 

var = tk.IntVar() 
cb = tk.Checkbutton(root, text="the lights are on", variable=var) 
cb.pack() 

def showstate(): 
    if var.get(): 
     print ("the lights are on") 
    else: 
     print ("the lights are off") 

button = tk.Button(root, text="show state", command=showstate) 
button.pack() 

root.mainloop() 

回答

1

你只需要让check变成一个实例变量self

class GUI: 
    def __init__(self, master): 
     self.check = IntVar() 



     self.e = Checkbutton(root, text="check me", variable=self.check) 
     self.e.grid(row=4, column=2) 

     self.macro_button = Button(master, text="Test Button", command=self.test) 
     self.macro_button.grid(row=11, column=1) 



    def test(self): 
     if self.check.get(): 
      print('its on') 
     else: 
      print('its off') 



root = Tk() 
root.resizable(width=False, height=False) 
my_gui = GUI(root) 
root.mainloop() 

你在网上找到的例子是写在一个“内联”的风格 - 这是很好的,直到你的GUI变得更大,你需要很多方法和变量使用/通过。

+0

非常感谢你的回应,它完美的作品,很明显,我是新来的这一切哈哈!当我不必为输入框中输入的文本变量执行相同操作时,为什么必须将其设置为实例变量? @ Luke.py – Ruthus99

+0

什么是输入框?你的意思是入口小部件?我可以看到你的代码中的任何一个! :S已经解决了你的问题? –

+0

是的我的意思是入口小部件,我知道我把它们留在了外面,但我只是问一个普通的python问题。是的,我的问题已经解决了,谢谢@ luke.py – Ruthus99