2016-12-07 13 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:

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 (сам. mainframe, text = 'Vote', command = self.quit) 'Ошибка читает следующее:' self.vote = ttk.Button (self.mainframe, text = 'Vote', command = self.quit) AttributeError: 'MyApp 'объект не имеет атрибута' quit'' – pdm

+0

Хммм, я не получаю эту ошибку. Может, это ваш редактор? Также проверьте, чтобы вы скопировали весь источник. –