tkinter 中的框架对象不对小部件进行分组

Frame object in tkinter not grouping widgets

我刚刚开始使用 tkinter 模块。我正在尝试使用我的自定义 classes 之一将不同的小部件组合成一个全新的小部件,它继承自 Frame 对象并希望垂直堆叠 4 个这样的新小部件。

每个新小部件包含 1 个 Label、3 个 Entry 小部件和 2 个 Button 小部件(按钮小部件在 4 个新小部件中的每一个中都有不同的用途).

为了垂直排列它们,我使用了不带参数的 pack() 方法。 问题 是,我没有以垂直方式显示所有 6 个旧小部件以 'grouped' 方式放置在新小部件内,而是 'skewed' 与所有按钮 'mixed' 一起显示(首先显示包值为 'left' 的所有小部件,然后显示包值为 'right' 的小部件)。

这是我的class OperationPanel的一部分(实际的class太大显示不出来,但是减法等其他操作存在,以及按钮的所有功能链接也存在):

class OperationPanel(Frame):
    def __init__(self, app, operation):
        Frame.__init__(self, app)
        if operation == "addition":
            Label(app, text="Addition:").pack()
            self.num1 = Entry(app)
            self.num1.pack(side = LEFT)
            self.num2 = Entry(app)
            self.num2.pack(side = LEFT)
            self.disp = Entry(app)
            self.disp.pack(side = LEFT)
            Button(app, text="Reset", command=self.reset_add).pack(side = RIGHT)
            Button(app, text="Add!",  command=self.calc_add).pack(side = RIGHT)

        elif operation == "subtraction":
            Label(app, text="Subtraction:").pack()
            self.num1 = Entry(app)
            self.num1.pack(side = LEFT)
            self.num2 = Entry(app)
            self.num2.pack(side = LEFT)
            self.disp = Entry(app)
            self.disp.pack(side = LEFT)
            Button(app, text="Reset", command=self.reset_sub).pack(side = RIGHT)
            Button(app, text="Subtract!", command=self.calc_sub).pack(side = RIGHT)

        elif operation == "multiplication":
            Label(app, text="Multiplication:").pack()
            self.num1 = Entry(app)
            self.num1.pack(side = LEFT)
            self.num2 = Entry(app)
            self.num2.pack(side = LEFT)
            self.disp = Entry(app)
            self.disp.pack(side = LEFT)
            Button(app, text="Reset", command=self.reset_mul).pack(side = RIGHT)
            Button(app, text="Multiply!",  command=self.calc_mul).pack(side = RIGHT)

        elif operation == "division":
            Label(app, text="Division:").pack()
            self.num1 = Entry(app)
            self.num1.pack(side = LEFT)
            self.num2 = Entry(app)
            self.num2.pack(side = LEFT)
            self.disp = Entry(app)
            self.disp.pack(side = LEFT)
            Button(app, text="Reset", command=self.reset_div).pack(side = RIGHT)
            Button(app, text="Divide!",  command=self.calc_div).pack(side = RIGHT)
...

这是我对 pack OperationPanel 对象的调用:

OperationPanel(app, "addition").pack()
OperationPanel(app, "subtraction").pack()
OperationPanel(app, "multiplication").pack()
OperationPanel(app, "division").pack()

这是 GUI 现在的样子:

第 1 部分:

第 2 部分:

看起来您正在创建 parent 为 app 的所有小部件。他们 parent 应该是 self:

if operation == "addition":
    Label(app, text="Addition:").pack()
    self.num1 = Entry(self)
    ...