【问题标题】:Adding widgets to third page causes Frames to adjust size将小部件添加到第三页会导致框架调整大小
【发布时间】:2016-11-26 12:30:50
【问题描述】:

我为我的 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 独有的,因为注释掉另一个框架小部件可以解决重新调整大小的问题。

任何反馈都将不胜感激!

【问题讨论】:

  • 注意:如果您使用pack 将小部件放入框架中,grid_propagate(0) 将没有任何效果。如果您使用的是pack,则必须使用pack_propagate

标签: python python-2.7 class user-interface tkinter


【解决方案1】:

我的建议是永远不要关闭几何传播。这几乎总是错误的选择。 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 增长或缩小以适应而付出的代价。

【讨论】:

  • 谢谢布赖恩。您的回答很好地解释了一切,并理顺了我遇到的问题。亲切的问候,卢克。
【解决方案2】:

在您的三个窗口中,您正在打包小部件,而不是网格化它们。所以你需要做的就是改变这一行:

window.grid_propagate(0)

到:

window.pack_propagate(0)

这样做之后,你会得到你所期望的:

【讨论】:

  • 感谢您的意见。但是,如果我使用 pack,所有三个窗口都是垂直放置的,并且都可以立即看到。不幸的是,这不是我需要的!
  • 不客气。从我截取的屏幕截图中可以看出,按照上面的修改运行程序时,我每次都会看到一个窗口。
  • 我看得出来! :) 我会发布自己的屏幕截图,但无法在 cmets 中发布!
  • 奇怪 :) 但无论如何,我很高兴你的另一个答案是有帮助的。
  • 长命百岁,兄弟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 2018-09-23
相关资源
最近更新 更多