2016-12-07 74 views
0

我使用tkinter 8.6与python 3.5.2,我试图创建一个图形用户界面,所以当我点击一个复选框,它允许用户写入输入框中的东西。但是我收到一个错误。以下是我的代码。如何使用复选框小部件将条目窗口小部件的状态从禁用更改为未禁用?

from tkinter import * 
from tkinter import ttk 

def quit(): 
    mainframe.quit() 

#Write in Function 
def write(): 
    write_in.state(['!disabled']) #Getting Error Here 

root = Tk() 
root.title("Voting Booth") 

#Global variables 
var = StringVar() 

#Create main widget 
mainframe = ttk.Frame(root, padding="3 3 12 12") 
mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
mainframe.columnconfigure(0, weight=1) 
mainframe.rowconfigure(0, weight=1) 

#Additional widgets 
ttk.Label(mainframe, textvariable=var, font=('bold')).grid(column=2, row=0) 
vote = ttk.Button(mainframe, text="Vote", command = quit).grid(column=4, row=5, sticky=E) 
don_box = ttk.Checkbutton(mainframe, text="Donald Trump").grid(column=2, row=1, sticky=W) 
stein_box = ttk.Checkbutton(mainframe, text="Jill Stein").grid(column=2, row=3, sticky=W) 
write_box = ttk.Checkbutton(mainframe, text="Write in:", command = write).grid(column=2, row=4, sticky=W) 
write_in = ttk.Entry(mainframe, width = 20, state=DISABLED).grid(column=3, row=4, sticky=W) 

#Setting variables and widgets 
var.set("Presidential Nominees") 

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5) 

root.mainloop(); 

但是我收到以下错误,当我点击write_in复选框:

" File "/usr/lib/python3.5/tkinter/__init__.py", line 1553, in __call__ 
return self.func(*args) 
File "./booth_gui.py", line 13, in write 
write_in.state(['!disabled']) 
AttributeError: 'NoneType' object has no attribute 'state' " 

回答

1

你得到一个NoneType异常,因为write_in对象实际上是None

的问题是,你声明write_in为:

write_in = ttk.Entry(...).grid(column=3, row=4, sticky=W) 

grid方法返回一个None结果。

grid的调用必须从窗口小部件声明分开:

write_in = ttk.Entry(...) 
write_in.grid(column=3, row=4, sticky=W) 

关于你改变控件的状态的样子,我真的不知道它应该工作。

尝试使用config(或configure)插件方法和state关键字设置为NORMAL:`self.vote = ttk.Button(自:

write_in.config(state=NORMAL) 
+0

我试过这个,但是当我点击复选框,它调用写函数时,它仍然给我一个错误。我不确定是否需要更改函数本身,或者如果我没有导入正确的库。 – pdm

+0

我不确定,因为我现在不能使用tkinter,我不知道ttk ...它给你什么错误?那'config'不存在,或者'state'无效,或者'NORMAL'没有被定义? –

+0

AttributeError:'NoneType'对象没有属性'config' – pdm

1

这里是一个完整的解决方案:

import tkinter 
from tkinter import ttk 

class MyApp: 
    def __init__(self): 
     self.root = tkinter.Tk() 
     self.root.title('Voting Booth') 

     self.labelvar = tkinter.StringVar() 
     self.votevar = tkinter.StringVar() 
     self.writevar = tkinter.StringVar() 

     self.mainframe = ttk.Frame(self.root, padding="3 3 12 12") 
     self.mainframe.grid(column=0, row=0, sticky='nsew') 
     self.mainframe.columnconfigure(0, weight=1) 
     self.mainframe.rowconfigure(0, weight=1) 

     self.label = ttk.Label(self.mainframe, textvariable=self.labelvar, font=('bold')) 
     self.vote = ttk.Button(self.mainframe, text='Vote', command=self.quit) 
     self.don_box = ttk.Radiobutton(self.mainframe, text='Donald Trump', variable=self.votevar, value='trump', command=self.write) 
     self.stein_box = ttk.Radiobutton(self.mainframe, text='Jill Stein', variable=self.votevar, value='stein', command=self.write) 
     self.write_box = ttk.Radiobutton(self.mainframe, text='Write in: ', variable=self.votevar, value='write', command=self.write) 
     self.write_in = ttk.Entry(self.mainframe, textvariable= self.writevar, width=20, state='disabled') 

     self.label.grid(column=2, row=0) 
     self.vote.grid(column=4, row=5, sticky='e') 
     self.don_box.grid(column=2, row=1, sticky='w') 
     self.stein_box.grid(column=2, row=3, sticky='w') 
     self.write_box.grid(column=2, row=4, sticky='w') 
     self.write_in.grid(column=3, row=4, stick='w') 

     self.labelvar.set('Presidential Nominees') 

     for child in self.mainframe.winfo_children(): 
      child.grid_configure(padx=5, pady=5) 

    def quit(self): 
     self.root.destroy() 

    def write(self): 
     if self.votevar.get() == 'write': 
      self.write_in['state'] = 'normal' 
     else: 
      self.write_in['state'] = 'disabled' 
      self.writevar.set('') 

    def run(self): 
     self.root.mainloop() 

MyApp().run() 
+0

我在下面的行得到一个错误。这个错误读取如下:'self.vote = ttk.Button(self.mainframe,text ='Vote',command = self.quit)AttributeError:'MyApp '对象没有属性'quit'' – pdm

+0

嗯,我没有得到那个错误。也许它是你的编辑器?同时检查以确保您复制了整个源文件。 –