tkinter类组合不起作用

时间:2017-07-05 20:17:32

标签: python-3.x inheritance tkinter

我的目的是从几个班级创建gui,作为练习,我创建了一个小例子。从app中可以看出,self.greet应该是从Button类创建的按钮,但我得到的是通用按钮(没有文本和回调函数)。 有什么建议吗?

import tkinter as tk
import tkinter.ttk as ttk

class Button(ttk.Button):

    def __init__(self, parent):
        super().__init__(parent)

        self.item = ttk.Button(parent, text="Greet", command=self.greet)

    def greet(self):
        print("Greetings!")

class App():

    def __init__(self, parent):        
        parent.title("A simple GUI")

        self.label = ttk.Label(parent, text="A label")
        self.greet = Button(parent)
        self.button = ttk.Button(parent, text="Close", command=parent.quit)

        self.label.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.W, tk.E))
        self.greet.grid(row=1, column=0, sticky=(tk.N, tk.S, tk.W, tk.E))
        self.button.grid(row=2, column=0, sticky=(tk.N, tk.S, tk.W, tk.E))

        parent.grid_columnconfigure(0, weight=1)        

    def greet(self):
        print("Greetings!")

if __name__ == "__main__":
    root = tk.Tk()
    app = App(root)
    root.mainloop()

2 个答案:

答案 0 :(得分:1)

您的班级Button的实例确实只是没有文字或回调的通用按钮。每个包含(通过他们的self.item属性)一个发烧友按钮,但该按钮实际上永远不会被用户看到,因为你从不打包或网格化。

基本上,您传递给ttk.Button()来电的参数应该在super().__init__()调用中传递,以便它们影响Button对象本身。

答案 1 :(得分:1)

您的新班级一个按钮,它不需要包含一个按钮。

class FlebasButton(ttk.Button):
    def __init__(self, master):
        super().__init__(master, text="Greet", command=self.greet)

    def greet(self):
        print("Greetings!")

另外,选择"按钮"以外的名称。为你的新课程,以便你(和其他人)不要把它与tk的班级混淆。并且tkinter使用" master"在内部为父类,所以通常更好地使用" master"以及tkinter对象。