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

Posted

技术标签:

【中文标题】tkinter 中的框架对象没有对小部件进行分组【英文标题】:Frame object in tkinter not grouping widgets 【发布时间】:2015-03-20 08:57:18 【问题描述】:

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

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

为了垂直排列它们,我使用了不带参数的pack() 方法。 问题 是,我没有以垂直方式显示所有 6 个旧小部件以“分组”方式放置在新小部件中,而是得到一个带有所有按钮的“倾斜”显示混合在一起(pack 值为'left' 的所有小部件首先显示,然后显示pack 值为'right' 的小部件)。

这是我的班级OperationPanel的一部分(实际班级太大而无法显示,但存在减法等其他操作,并且按钮链接到的所有功能也存在):

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

这是我对 packOperationPanel 对象的调用:

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

下面是 GUI 现在的样子:

第 1 部分:

第 2 部分:

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于tkinter 中的框架对象没有对小部件进行分组的主要内容,如果未能解决你的问题,请参考以下文章

展开文本小部件以填充 Tkinter 中的整个父框架

如何自定义 tkinter/ttk 小部件和框架的边框颜色?

QVBoxLayout 间距

tkinter canvas create_window

在图像框架上叠加tkinter小部件

使用透明背景、ttk 框架背景颜色配置 tkinter/ttk 小部件?