无法正确地将类与其对象“连接”

时间:2016-05-01 03:31:22

标签: python class python-3.x tkinter

我想创建一个类,它将成为我试图制作的“游戏”的“自定义小部件”的模板。问题是我只能在它调用类时才能使它工作,我指定了将所有东西放在一起的Frame对象。我整个下午一直在寻找,但找不到具体的答案......

以下代码有效但不仅需要编写StatusButton().grid()我必须使用StatusButton().frame.grid()

from tkinter import *
from tkinter.ttk import Progressbar

class StatusButton(Frame):
    def __init__(self, master):
        super(StatusButton, self).__init__()
        self.frame = Frame(master, padx = 10, pady = 10, bd= 5, relief = RAISED)
        self.label = Label(self.frame, text = "Hunger Bar")
        self.pgbar = Progressbar(self.frame)
        self.button = Button(self.frame, text = "Eat")
        self.label.pack()
        self.pgbar.pack()
        self.button.pack(pady = 5, ipadx = 15)
        return

root = Tk()   
buttonslist = [StatusButton(root) for x in range(16)]

for r in range(4):
    for c in range(4):
        StatusButton(root).frame.grid(row = r, column = c)
root.mainloop()

我猜我没有正确地将框架对象“绑定”到类中,即使前者位于后者内部,因为当前面的代码被执行时,而StatusButton().grid()代替了,TKinter窗口正常弹出,但没有任何内容,如果我正在“网格化”一个空的Frame对象。我该如何解决这个问题,以便在运行StatusButton().grid()时,出现“自定义小部件”?

很抱歉,如果这是noob错误,那是我编程的第一周

1 个答案:

答案 0 :(得分:0)

问题是你没有利用你的子类。您在没有参数的情况下初始化Frame,然后使用参数创建一个新的参数。然后,您使用self.frame作为父级而不是self创建小部件。将其更改为:

class StatusButton(Frame):
    def __init__(self, master):
        super(StatusButton, self).__init__(master, padx=10, pady=10, bd=5, relief=RAISED)
        self.label = Label(self, text="Hunger Bar")
        self.pgbar = Progressbar(self)
        self.button = Button(self, text="Eat")
        self.label.pack()
        self.pgbar.pack()
        self.button.pack(pady=5, ipadx=15)