【问题标题】:Getting the value of a checkbox获取复选框的值
【发布时间】:2015-07-31 04:29:34
【问题描述】:

这是我在搜索以了解和了解 Tkinter 时发现的代码,但它在复选框切换时出现错误。

from Tkinter import * 
    class Example(Frame):
    
    
        def __init__(self, parent):
            Frame.__init__(self, parent)   
            self.parent = parent
            self.initUI()
    
        def initUI(self):      
            self.parent.title("Windows")
    
    
            Label(text="Contact List").grid(row=0,column=0,columnspan=2)
            Text(width=30,height=15).grid(row=1,rowspan=9, column=0,columnspan=2,padx=20)
            Button(text="Display Contact").grid(row=10, column=0,columnspan=2,pady=10)
            Label(text="Last Name:").grid(row=11, column=0,pady=10)
            Entry().grid(row=11,column=1)
            Button(text="Search").grid(row=12,column=0,columnspan=2)
            Label(text="New Contact").grid(row=0,column=2,columnspan=2)
            Label(text="First Name:").grid(row=1,column=2,sticky=E)
            Entry().grid(row=1,column=3)
            Label(text="Last Name:").grid(row=2,column=2,sticky=E)
            Entry().grid(row=2,column=3)
            Label(text="Phone #:").grid(row=3,column=2,sticky=E)
            Entry().grid(row=3,column=3)
            
            friend_check = IntVar()
            Checkbutton(variable=friend_check, command = self.friend_box, onvalue=1, offvalue=0, text = "Friend").grid(row=4,column=3,sticky=W)
            
            #Label(text="Friend").grid(row=4,column=3,padx=20,sticky=W)
            Label(text="Email:").grid(row=5,column=2,sticky=E)
            Entry().grid(row=5,column=3)
            Label(text="Birthday:").grid(row=6,column=2,sticky=E)
            Entry().grid(row=6,column=3)
            Button(text="Add Contact").grid(row=7,column=3,sticky=E)
    
    
        def friend_box(self):
    
            if self.friend_check.get() == 1:
                print '1'
            else:
                print '0'
    
    
    def main():
    
        root = Tk()
        
        root.geometry("600x450+900+300")
        root.resizable(0,0)
        app = Example(root)
        root.mainloop()  
    
    
    if __name__ == '__main__':
        main()  

这是上面提到的错误:

AttributeError:示例实例没有属性“friend_check”

Tkinter 回调异常

我怎样才能避免这个错误?

【问题讨论】:

    标签: python checkbox tkinter


    【解决方案1】:

    您在代码中使用了太多快捷方式。我们来看一个例子:

    Label(text="Contact List").grid(row=0,column=0,columnspan=2)
    

    这会创建一个Label,但不会保存对它的引用。它将显示在 GUI 中,但如果您想重新引用它,您将无法这样做。当您有类似Entry 小部件时,这一点很重要,您几乎可以保证再次使用它(对于get())。

    另一个问题是您将几何管理链接到小部件创建。如果您确实保存了对此的引用,它只会指向None,这是几何管理方法返回的值。

    要解决此问题,请取消链接语句并保存参考:

    self.cl_label = Label(text="Contact List")
    self.cl_label.grid(row=0,column=0,columnspan=2)
    

    为您创建的每个小部件执行此操作。

    对于friend_check,您需要将其设置为实例变量而不是局部变量,因为局部变量在其范围之外无法使用,并且在包含函数结束时被丢弃。通过在引用名称前添加 self. 来执行此操作。

    self.friend_check = IntVar()
    

    【讨论】:

    • NameError:全局名称“friend_check”未使用 self 定义。添加。感谢您列举的问题
    • 是的,这就是为什么我说叫它self.friend_check。在任何地方都使用该名称,而不是简单地使用friend_check
    • 很高兴听到这个消息!您可以通过单击其分数下方的复选标记来表明此答案解决了您的问题。
    • 您还需要确保在初始化 UI 之前定义了self.friend_check。发布的代码在之后完成。这是问题中错误的根本原因。
    • @BryanOakley - 在最初的问题中,该变量是在适当的时间定义的。但是,OP 已经编辑了问题的代码以包含此答案的建议 self.,并将定义移至 __init__()。我会把它回滚,所以这个问题又有意义了。
    猜你喜欢
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 2013-12-23
    • 1970-01-01
    相关资源
    最近更新 更多