2015-07-30 3 views
-1

Это код, который я нашел при поиске, чтобы понять и узнать о 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: Example instance has no attribute 'friend_check'

Exception in Tkinter callback

Как я могу избежать этой ошибки?

ответ

0

Вы принимаете слишком много ярлыков в своем коде. Давайте посмотрим на пример:

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

Это создает Label, но не сохраняет ссылку на него. Он будет отображаться в графическом интерфейсе, но если вы захотите вернуться к нему, вы не сможете. Это важно, когда у вас есть что-то вроде виджета 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() 
+0

ИмяError: глобальное имя 'friend_check' не определяется с помощью self. добавлено. Спасибо за перечисленные вопросы. – busymind

+0

Да, поэтому я назвал это 'self.friend_check'. Используйте это имя везде, а не просто 'friend_check'. – TigerhawkT3

+0

Действительно благодарю вас за свою работу. – busymind

Смежные вопросы