我为我的 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/