包装tkinter小部件打破框架

时间:2017-07-27 19:52:44

标签: python-3.x tkinter

因此,当我初始化我的Gui类然后打包()我的标签和按钮小部件时,我已经配置了它们存在于休息中的帧的漂亮的框架样式。为什么如果你注释掉按钮的包装并标记小部件,它就是我想要它的样子。

class Gui(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent

        self.parent.wm_title("Conflict found")
        self.TV = 'Hello'
        # Creation
        self.statusbar = statusbar(self, bg="black", height=100, width=300)
        self.main = Main(self, bg="grey", height=50, width=300)

        # Packing
        self.statusbar.pack(side="top", expand=True)
        self.statusbar.label.pack()
        self.main.pack(side="bottom", expand=True)
        self.main.button.pack()

    def quit(self):
        self.parent.destroy()


class Main(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.button = tk.Button(self, text="Exit", command=self.quit)


class statusbar(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.label = tk.Label(self, text=self.parent.TV, fg='white')

2 个答案:

答案 0 :(得分:2)

简短的回答是,这就是tkinter的设计方式。当您使用packgrid时,tkinter将导致父窗口增大或缩小以适合其子项。

这是你想要99.999%的时间,因为它可以让你根据字符大小(或重要时的像素,如图像)来关注小部件的大小,并且GUI的大小合适。

当您为框架和窗口选择特定大小时,如果用户具有不同的字体,不同的操作系统或具有不同分辨率的显示器,或者用户尝试增长或者用户,则您的程序看起来不会正常手动缩小窗口。

有很多方法可以解决此问题,但您几乎不想关闭此行为。最好的解决方案是关注内部小部件,让tkinter担心窗口大小。

而不是思考"我需要一个100像素高,300像素宽的状态栏",想想"我需要一个可以容纳至少20个字符的状态栏,并且水平填充窗口& #34 ;.无论您使用什么字体,分辨率或操作系统,Tkinter都会做正确的事情。

答案 1 :(得分:1)

Frame的height=width=通常仅在Frame为空时才适用。只要向其添加任何子窗口小部件,就会将其大小重新计算为保存所有子项所需的最小值。为避免这种情况,您可以在框架上调用.pack_propagate(0)(如果您对儿童使用.grid_propagate(0),则为.grid())。