2014-01-24 2 views
0

Я хочу создать объект BooleanVar(), move_choice_S, который отвечает на кнопку self.bttn15 и функцию update_moves() и отображает содержимое, когда кнопка нажата в текстовом поле self.txt_box. Я не уверен, как и где создать экземпляр объекта move_choice_S, я попытался с move_choice_S = BooleanVar(), чтобы затем использовать команду self.update_moves(), но я продолжаю получать AttributeError и TypeError с ошибкой, что нет экземпляра, вызванного move_choice_S. Я также пытался импортировать Tkinter как tk и move_choice_S = tk.BooleanVar(), но я продолжаю получать AttributeError: У экземпляра приложения нет атрибута 'move_choice_S'. Как создать экземпляр объекта self.move_choice_S?TypeError и AttributeError при создании объекта BooleanVar() в приложении Tkinter

class Application(Frame): 


    def __init__(self, master): 
     """ init the frame """ 
     Frame.__init__(self) 
     self.grid() 
     self.create_widgets() 

    def create_widgets(self): 

     self.bttn15 = Button(self, text = "OK", variable = self.move_choice_S, command = self.update_moves) 
     self.bttn15.grid(row = 14, column = 4, sticky = W) 

     # message 
     self.box_txt = Text(self, width = 65, height = 25, wrap = WORD) 
     self.box_txt.grid(row = 15, column = 0, columnspan = 5, sticky = W) 


    def update_moves(self): 

     moves = "" 
     if self.move_choice_S.get(): 
      moves = "S" 

     self.box_txt.insert(0.0, END) 


     self.box_txt.insert(0.0, moves) 


# Main 
root = tk.Tk() 

move_choice_S = tk.BooleanVar() 
move_choice_S.set(True) 
move_choice_S.get() 


root.title("Maltparser1.0_demo") 

root.geometry("900x700") 

app = Application(root) 
root.mainloop() 
+0

В этом коде вы получаете «AttributeError: экземпляр приложения не имеет атрибута« move_choice_S », потому что move_choice_S создан в основном не в приложении класса, так что вам не нужно« самостоятельно », чтобы« работать »с этим кодом. Поскольку вы устанавливаете свою переменную True сразу после запуска кода, она всегда будет вставлять S после нажатия кнопки. – Lafexlos

+0

и каковы ваши версии tkinter, python? – Lafexlos

+0

Я использую Python 2.6.6, я продолжаю получать ту же ошибку об опциональной переменной. – user1749431

ответ

0

Я немного обновил ваш код. Теперь он работает без ошибок, но поскольку вы устанавливаете move_choice_S на номер True, он записывает только text только S при каждом нажатии кнопки.

EDIT: Я обновил move_choice_S части. Поскольку в глобальном масштабе вы определили move_choice_S, вам не нужно использовать self. для использования/достижения. Вы можете использовать его на move_choice_S или, как сказал @FabienAndre, вы можете определить его в __init__.

-option sticky нуждается в его аргументе как строке. Поэтому я изменил их.

insert требуется как минимум два аргумента. Сначала это индекс, а второй - то, что будет вставлено.

Я импортировал, используя форму import xxx, поэтому я изменил все tkinter предметов в соответствии с этим, но это просто привычка. Вам не нужно использовать эту форму import.

import Tkinter as tk 

class Application(tk.Frame): 
    def __init__(self, master): 
     """ init the frame """ 
     tk.Frame.__init__(self) 
     self.grid() 
     self.create_widgets() 

    def create_widgets(self): 
     self.bttn15 = tk.Button(self, text = "OK", command = self.update_moves) 
     self.bttn15.grid(row = 14, column = 4, sticky = "W") 

     # message 
     self.box_txt = tk.Text(self, width = 65, height = 25, wrap = "word") 
     self.box_txt.grid(row = 15, column = 0, columnspan = 5, sticky = "W") 

    def update_moves(self): 

     moves = "" 
     if move_choice_S.get(): 
      moves = "S" 

     self.box_txt.insert(0.0, moves + "\n") 

# Main 
root = tk.Tk() 

move_choice_S = tk.BooleanVar() 
move_choice_S.set(True) 
move_choice_S.get() 


root.title("Maltparser1.0_demo") 

root.geometry("900x700") 

app = Application(root) 
root.mainloop() 
+0

Ваш ответ был бы лучше, если бы вы описали, что вы изменили. Как и сейчас, читатель вынужден последовательно проводить сравнение, чтобы узнать, что вы сделали. –

+0

Спасибо за головы. Я попытался объяснить, что я сделал. – Lafexlos

+0

Спасибо, он работает. – user1749431

0

В глобальном пространстве имен создается переменная move_choice_S. Его можно найти из любой точки вашей программы, используя исходное имя move_choice_S.

Чтобы устранить проблему, вы можете:

  • доступ без self в update_moves,
  • определить его в Application конструктор, а именно:

    class Application(Frame): 
        def __init__(self, master): 
         (...) 
         self.move_choice_S = BooleanVar() 
    

You может прочитать this book chapter для подробного объяснения области в Python.

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