python - 将小部件添加到第三页会导致 Frames 调整大小

标签 python python-2.7 class user-interface tkinter

我为我的 GUI 创建了 3 个框架(页面)并添加了几个小部件来显示我的 GUI 的基本框架。

我已使用 .grid_propagate(0) 方法阻止我的框架根据其中的小部件调整大小。

代码如下:

from Tkinter import *
# from tkFileDialog import askopenfilename
# from Function_Sheet import *
# from time import sleep
# import ttk, ttkcalendar, tkSimpleDialog, csv, pyodbc, threading
# from Queue import Queue
# import os
# cwd = os.getcwd()


class CA_GUI:

    def __init__(self, master):
        ### Configure ###
        win_colour = '#D2B48C'
        master.title('CA 2.0'), master.geometry('278x289'), master.configure(background='#EEE5DE')
        win1, win2, win3 = Frame(master, background=win_colour, bd=5, relief=GROOVE, pady=10, padx=20, width=260, height = 270), Frame(master, background=win_colour, bd=5, relief=GROOVE, pady=10, padx=20, width=260, height = 270), Frame(master, background=win_colour, bd=5, relief=GROOVE, pady=10, padx=20, width=260, height = 270)

        ### Grid Frames ###
        for window in [win1,win2,win3]:
            window.grid(column=0, row=0, sticky='news', pady=10, padx=10)
            window.grid_propagate(0)

        ### Window 1 ###
        self.win1_label1 = Label(win1, text = 'This is page 1!')
        self.win1_label1.pack(fill = X, side = TOP)

        self.win1_button1 = Button(win1, text = 'Close', command = master.quit)
        self.win1_button1.pack(fill = X, side = BOTTOM)

        self.win1_button2 = Button(win1, text = 'Page 2', command = lambda:self.next_page(win2))
        self.win1_button2.pack(fill = X, side = BOTTOM)

        ### Window 2 ###
        self.win2_label1 = Label(win2, text = 'This is page 2!')
        self.win2_label1.pack(fill = X, side = TOP)

        self.win2_button1 = Button(win2, text = 'Close', command = master.quit)
        self.win2_button1.pack(fill = X, side = BOTTOM)

        self.win2_button2 = Button(win2, text = 'Page 3', command = lambda:self.next_page(win3))
        self.win2_button2.pack(fill = X, side = BOTTOM)

        ### Window 3 ###
        self.win3_label1 = Label(win3, text = 'This is page 3!')
        self.win3_label1.pack(fill = X, side = TOP)

        win1.tkraise()

    def next_page(self, window):
        window.tkraise()

root = Tk()
b = CA_GUI(root)
root.mainloop()

当我将小部件添加到 win3 时,问题就来了。如果我注释掉与 win3 相关的代码,所有的框架都保持在它们指定的大小并且一切看起来都很好。然而,即使将一个简单的标签小部件添加到 win3,框架大小似乎也会根据其小部件的大小进行调整。 - 这不是我想要的!

附言

这个问题似乎并不是 win3 独有的,因为注释掉另一个框架小部件可以解决重新调整大小的问题。

如有任何反馈,我们将不胜感激!

最佳答案

我的建议是永远不要关闭几何传播。这几乎总是错误的选择。 Tkinter 在高效地布置小部件方面做得非常出色。让框架收缩(或增长)以适应内容,并使用几何管理器使框架适应分配给它的空间。

此代码中的问题是您不允许网格将所有空间分配给框架。您需要至少给一行和一列“权重”,以便网格将为该行和列分配额外的空间,迫使框架填充空间而不是收缩。

将代码的一部分更改为如下所示:

### Grid Frames ###
master.grid_rowconfigure(0,weight=1)
master.grid_columnconfigure(0,weight=1)

for window in [win1,win2,win3]:
    window.grid(column=0, row=0, sticky='news', pady=10, padx=10)

这一切都有效,因为您为主窗口指定了明确的大小。在某种意义上,为窗口设置固定大小会关闭基于其直接子窗口自动调整大小的功能。关闭调整大小并正确使用网格选项后,内部框架将填满窗口。

当然,如果你放的小部件太大放不下,它们会被砍掉。这就是您为使用显式尺寸而不是让 tkinter 增大或缩小以适应尺寸而付出的代价。

关于python - 将小部件添加到第三页会导致 Frames 调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38529224/

相关文章:

python - 如何调整 MLPRegressor?

c++ - 错误 : no matching function for call

jquery - Chrome 中的表格行为

python - 从 Python 中的 stdin 读取整数

python - Python 中的简单感知器

Python:下面的代码做了什么?

python - 如何在 Pandas 数据框行中找到最后一个集群?

python - 为什么我无法在此嵌套字典中创建其他键?

python - 我怎样才能避免这个 "variable referenced before assignment"?

c++ - 比较 C 和 C++ 中的结构