Python Tkinter:在打包框架内,如何均匀分布 grid() 列宽度?

问题描述 投票:0回答:1

我需要使用 Frame 小部件来执行此操作;我知道我可以在不使用框架的情况下做到这一点,只需使用一个大网格来包含所有内容(画布的列跨度等),但如果可能的话,我想将东西放入框架中。

有关我的软件版本的快速信息:

=> OS: macOS Catalina 10.15.7
=> IDE: PyCharm CE
=> Python version: 3.12.5
=> tkinter Tcl version: 8.6 (from importing tkinter and using: print(tkinter.TclVersion))

我正在尝试实现以下目标:

  • 将框架装入窗口
  • 将 1 个标签和 2 个按钮网格放入框架中,呈 1 行 3 列
  • 在框架下放一块画布(固定尺寸:宽度=500,高度=500)
  • 确保框架内网格的列分布均匀

我尝试了以下方法,但没有成功:

  1. 设置框架宽度为500,等于画布的宽度
  2. 使用 .pack_propagate(0) 阻止网格子部件(1 个按钮和 2 个标签)影响框架的宽度
  3. 对网格按钮和标签使用“粘性”属性(无论如何这都没有帮助,因为它更像是小部件在网格空间内的对齐方式)
  4. 将按钮和 2 个标签打包到框架中,并使用“expand=True”属性
  5. 对 3 列中的每一列使用frame.columnconfigure(n,weight = 1)
  6. 打包框架(其中包含按钮+标签小部件),然后打包画布
  7. 在显示窗口之前执行 window.update() 来更新它

就像我上面说的,如果我去掉框架和网格所有东西,我可以很容易地做到这一点,如下所示:

  • 第 0 行,第 0 列:按钮
  • 第 0 行,第 1 列:label_1
  • 第 0 行,第 2 列:label_2
  • 第 1 行,第 0 列:画布,列跨度=3 但是,我真的很想将按钮+标签小部件放入框架中,以备以后需要。

那么考虑到我正在尝试实现的内容,我错过/做错了什么,导致我无法扩展网格的宽度,使其基本上填充整个窗口宽度?

我的代码如下。

from tkinter import *

# check to see if we're in macOS
import platform
inMac = False   # global flag to check whether we're in macOS
if platform.system() == "Darwin":
    inMac = True
    print("Using macOS ...")
    from tkmacosx import Button


window = Tk()


frame = Frame(window, width=500)                # [NO HELP]: Setting frame attribute: width=500.
frame.pack()
#frame.grid(row=0,column=0)                     # [NO HELP]: Trying to put the frame and canvas in grid.
frame.pack_propagate(0)                         # [NO HELP]: Using Frame.pack_propagate(0) to stop child widgets
                                                #  from affecting the dimensions of the frame widget.

button = Button(frame, text="Button")
button.grid(row=0, column=0, sticky=W)          # [NO HELP]: Setting "sticky" attribute.
#button.pack(side=LEFT, fill="x", expand=True)  # [NO HELP]: Setting "expand" attribute with Button.pack().


label_1 = Label(frame, text="Whatever #1")
label_1.grid(row=0, column=1)
#label_1.pack(side=LEFT, fill="x", expand=True) # [NO HELP]: Setting "expand" attribute with Label.pack().

label_2 = Label(frame, text="Whatever #2")
label_2.grid(row=0, column=2, sticky=E)         # [NO HELP]: Setting "sticky" attribute.
#label_2.pack(side=LEFT, fill="x", expand=True) # [NO HELP]: Setting "expand" attribute with Button.pack().

frame.columnconfigure(0, weight=1)              # [NO HELP]: Setting equal weights for each column
frame.columnconfigure(1, weight=1)
frame.columnconfigure(2, weight=1)

canvas = Canvas(window, width=500, height=500)
#canvas.grid(row=1, column=0)                   # [NO HELP]: (As above) Trying to put the frame and canvas in grid.
canvas.pack()

# [NO HELP]: Update window before we display it
#window.update()


window.mainloop()

谢谢你。

python tkinter grid frame macos-catalina
1个回答
0
投票

为了实现你想要的,你需要:

  • fill='x'
    添加到
    frame.pack(...)
    ,使框架水平扩展至与画布宽度相同
  • 在这些按钮和标签上的
    uniform=<something>
    上添加
    .grid(...)
    以使三列具有相同的宽度。 具有相同
    uniform
    值的列将具有相同的宽度。

以下是修改后的代码:

from tkinter import *
import platform

inMac = False
if platform.system() == "Darwin":
    inMac = True
    print("Using macOS ...")
    from tkmacosx import Button

window = Tk()

frame = Frame(window)
frame.pack(fill='x')  # added fill='x'

button = Button(frame, text="Button")
button.grid(row=0, column=0, sticky=EW)

label_1 = Label(frame, text="Whatever #1", bg='yellow')
label_1.grid(row=0, column=1, sticky=EW)

label_2 = Label(frame, text="Whatever #2", bg='cyan')
label_2.grid(row=0, column=2, sticky=EW)

frame.columnconfigure(0, weight=1, uniform='a') # added uniform='a'
frame.columnconfigure(1, weight=1, uniform='a')
frame.columnconfigure(2, weight=1, uniform='a')

canvas = Canvas(window, width=500, height=500, bg='pink')
canvas.pack(fill='both', expand=1)

window.mainloop()

请注意,我已在这些按钮和标签上将

sticky=EW
添加到
.grid(...)
,以便这些小部件将扩展以填充分配的空间。 还可以在这些小部件上设置背景颜色以显示最终效果。

输出:

enter image description here

请注意,我的平台是Windows,但我认为在MacOS上结果会是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.