Python Tkinter Frame Class不识别对象

时间:2017-06-16 21:22:33

标签: python tkinter

update_id

它称之为:' MainApplication'对象没有属性' button1'。为什么呢?

2 个答案:

答案 0 :(得分:1)

在command属性中,您必须传递函数的名称,不应该调用该函数。在你的情况下self.ev

除了获取变量的名称外,您还必须使用{your button}['text']{your button}.cget('text')

同样def ev(event, self):不正确,命令不传递任何参数,因此您只需传递实例:self。

注意:您必须始终先传递实例:def some_function(self, other params ...)

class MainApplication(ttk.Frame):
    texty = "text"

    def __init__(self, parent, *args, **kwargs):
        tkinter.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.button1 = ttk.Button(text=MainApplication.texty, command=self.ev)
        self.button1.pack()

    def ev(self):
        print(self.button1['text']) # or self.button1.cget('text')

root = tkinter.Tk()
w = MainApplication(root)
root.mainloop()

答案 1 :(得分:0)

您的代码存在许多问题,而不仅仅是您的MainApplication对象错误。

  1. 使用texty初始化实例以创建根或主顶层窗口。

  2. 不要通过尝试调用类名来调用类中的类属性。

  3. __init__变量放在班级的self部分内,并将self.button1.text放在其前面,使其成为属性。

  4. 保持良好的缩进以使代码正常工作,因此请确保您的方法在课堂上有4个空格缩进。

  5. 不要打印self.texty而是通过打印self.button1['text']来打印属性值。如果您确实要在按钮上打印文字,可以使用self.button1.cget("text")command = slef.ev(self)来完成此操作。

  6. 将您的类分配给变量,以便在需要时可以从类外部与其属性进行交互。

  7. self.ev传递2个自我参数,只需要一个。请改为from tkinter import ttk import tkinter root = tkinter.Tk() class MainApplication(ttk.Frame): def __init__(self, parent, *args, **kwargs): tkinter.Frame.__init__(self, parent, *args, **kwargs) self.texty = "text" self.parent = parent self.button1 = ttk.Button(text = self.texty, command= self.ev) self.button1.pack() def ev(self): print(self.texty) # for printing the value of the attribute print(self.button1['text']) # for printing the current text of the button app = MainApplication(root) root.mainloop()

  8. def print_something():
        print(app.texty) # this is why we assign the class to a variable
        print(app.button1['text']) # it allows us to interact with class atributes from outside the class
    

    只是因为你试图从课堂外打印属性

    您可以将其放在课外以查看其结果。

    {{1}}