【问题标题】:python, tkinter - Frame height and width parameter values have no effectpython,tkinter - 框架高度和宽度参数值无效
【发布时间】:2017-09-25 10:47:01
【问题描述】:

我正在尝试创建 16 个按钮,它们将完全占据窗口底部的 3/4。但是,框架高度和宽度值似乎没有任何影响。如何获得我想要的行为?

from tkinter import *


class Application(object):
    def __init__(self):
        # Creating the main window
        self.window = Tk()
        self.window.geometry('{}x{}'.format(400, 400))

        # frame where numbered buttons will be
        frame = Frame(self.window)
        frame.configure(height=300, width=300)
        frame.pack(side=BOTTOM)

        # add buttons
        for i in range(4):
            for j in range(4):
                Button(frame, text=str(4*i + j + 1)).grid(row=i, column=j, sticky=N+E+S+W)
        self.window.mainloop()


def main():
    app = Application()

main()

【问题讨论】:

  • 将参数master 传递给__init__,然后将调整大小的行更改为应该可以工作的master.geometry('{}x{}'.format(400, 400))
  • @WhatsThePoint 我不太明白你的意思。你能详细说明一下吗?
  • 因为根本问题是一样的。 Tkinter 小部件旨在缩小(或扩展)以适应它们的孩子。因此,如果您将大小应用于框架,然后将小部件放置在该框架内,则框架将缩小以适应。你问出了什么问题,答案是没有问题——这是 Tkinter 的默认行为。
  • 我建议你改写你的问题,问你真正想要什么。对我来说,这听起来像是你在问为什么 UI 会这样。如果您不关心原因,但实际上想知道如何将主窗口分成两部分,其中一个是屏幕的 1/4,一个是 3/4,请改为询问。
  • 网格列和行可以配置为具有最小像素大小。 frame.grid_columnconfigure(i, minsize=75), frame.grid_rowconfigure(j, minsize=75).

标签: python tkinter


【解决方案1】:

您看到的行为的原因是 tkinter 小部件被设计为在使用 gridpack 时收缩或扩展以完全适合其子级。在 99.99% 的情况下,这是完全正确的行为,因为它会导致 GUI 响应字体大小、屏幕分辨率和窗口大小的变化。

如果您的目标是将屏幕分成两部分,其中一部分占屏幕的 1/4,一部分占屏幕的 3/4,那么最好的解决方案是使用gridplace,因为那些两者都可以轻松设置相对大小。

我通常不推荐place,所以这里有一个使用网格的解决方案。注意grid.rowconfiguregrid.columnconfigure的使用

from tkinter import *

class Application(object):
    def __init__(self):
        self.window = Tk()
        self.window.geometry('{}x{}'.format(400, 400))

        self.window.grid_rowconfigure(0, weight=1)
        self.window.grid_rowconfigure(1, weight=3)
        self.window.grid_columnconfigure(0, weight=1)

        frame = Frame(self.window, background="pink")
        frame.grid(row=1, column=0, sticky="nsew")

        for row in range(4):
            frame.grid_rowconfigure(row, weight=1)
        for column in range(4):
            frame.grid_columnconfigure(column, weight=1)

        # add buttons
        for i in range(4):
            for j in range(4):
                button = Button(frame, text=str(4*i + j + 1))
                button.grid(row=i, column=j, sticky=N+E+S+W)
        self.window.mainloop()


def main():
    app = Application()

main()

在此示例中,根窗口中的第 0 行(零)可用于您想要的任何内容。 Tkinter 将尽最大努力始终使 GUI 的那部分成为窗口高度的 1/4。我建议在该行中放置一个框架,然后在该框架中放置任何其他小部件。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 2013-11-29
  • 1970-01-01
  • 2020-06-14
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多