在Tkinter应用程序中创建BooleanVar()对象时的TypeError和AttributeError

时间:2014-01-24 16:22:47

标签: python tkinter typeerror tk attributeerror

我想创建一个BooleanVar()对象move_choice_S,它响应Button self.bttn15 和函数update_moves()并在文本框self.txt_box中按下按钮时显示内容。我不确定如何以及在何处实例化对象move_choice_S,我尝试使用move_choice_S = BooleanVar()然后使用命令self.update_moves()但我继续使用errormessage获取AttributeError和TypeError,没有实例调用move_choice_S。我也尝试将Tkinter导入为tk和move_choice_S = tk.BooleanVar(),但我一直得到AttributeError:应用程序实例没有属性'move_choice_S'。我应该如何实例化对象self.move_choice_S?

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()

2 个答案:

答案 0 :(得分:0)

我稍微更新了你的代码。现在它正在运行而没有错误,但由于您将move_choice_S设置为True,因此每按一次按钮,它只会text S

编辑:我更新了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()

答案 1 :(得分:0)

您正在全局命名空间中创建move_choice_S变量。可以使用原始名称move_choice_S从程序中的任何位置访问它。

要解决您的问题,您可以:

  • self
  • 中不使用update_moves访问它
  • Application构造函数中定义它,即:

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

您可以阅读this book chapter以获取有关Python范围的深入解释。