【问题标题】:Cant design the GUI with tkinters pack the way I want to可以按照我想要的方式使用 tkinter pack 设计 GUI
【发布时间】:2019-10-18 08:53:13
【问题描述】:

我是 python 新手,我对包管理器有疑问。我的目标是创建以下布局:

BUTTON1 BUTTON2 LABEL1
<--------------CANVAS EXPANDED -------------->
<--------------CANVAS EXPANDED -------------->
<--------------CANVAS EXPANDED -------------->
<--------------CANVAS EXPANDED -------------->
<--------------CANVAS EXPANDED -------------->

我尝试了以下方法:

BUTTON1.pack(side=tk.TOP, anchor=tk.W)
BUTTON2.pack(side=tk.TOP, anchor=tk.W,padx=5)
LABEL1.pack(side=tk.TOP, anchor=tk.W,padx=5)
CANVAS.pack(side=tk.BOTTOM,fill=tk.BOTH, expand=1)

给我以下:

BUTTON1
 BUTTON2
 LABEL1
<--------------CANVAS EXPANDED -------------->
<--------------CANVAS EXPANDED -------------->
<--------------CANVAS EXPANDED -------------->
<--------------CANVAS EXPANDED -------------->
<--------------CANVAS EXPANDED -------------->

这个:

BUTTON1.pack(side=tk.LEFT, anchor=tk.N)
BUTTON2.pack(side=tk.LEFT, anchor=tk.N,padx=5)
LABEL1.pack(side=tk.LEFT, anchor=tk.N,padx=5)
CANVAS.pack(side=tk.BOTTOM,fill=tk.BOTH, expand=1)

给我这个:

BUTTON1 BUTTON2 LABEL1 <--------------CANVAS EXPANDED -------------->
                       <--------------CANVAS EXPANDED -------------->
                       <--------------CANVAS EXPANDED -------------->
                       <--------------CANVAS EXPANDED -------------->
                       <--------------CANVAS EXPANDED -------------->

这很接近,但仍然不是我想要的:

BUTTON1.pack(side=tk.LEFT, anchor=tk.N)
BUTTON2.pack(side=tk.LEFT, anchor=tk.N,padx=5)
LABEL1.pack(side=tk.TOP, anchor=tk.W,padx=5)
CANVAS.pack(side=tk.BOTTOM,fill=tk.BOTH, expand=1)

给我这个:

BUTTON1 BUTTON2 LABEL1
                <--------------CANVAS EXPANDED -------------->
                <--------------CANVAS EXPANDED -------------->
                <--------------CANVAS EXPANDED -------------->
                <--------------CANVAS EXPANDED -------------->
                <--------------CANVAS EXPANDED -------------->

怎么做?

【问题讨论】:

  • 虽然我通常是使用 pack 的拥护者,但这似乎是您想要构建一个类似网格的 GUI 的情况。您是否考虑过使用网格功能?有不合适的原因吗?
  • 您好伊桑,感谢您的回答。我用网格尝试过,但画布没有按照我希望的方式展开。我还想从左上到右排序按钮,无论顶部的按钮放在哪里,图片都应该适合整个区域。
  • Grid 确实具有以您描述的方式扩展小部件的能力。 stackoverflow.com/questions/45847313/…stackoverflow.com/questions/50158866/… 可能会有所帮助。
  • 谢谢,问题已解决。我在这里写下我的解决方案。

标签: python tkinter pack


【解决方案1】:

用 Ethan 的提示解决了问题:

BUTTON1.grid(row=0,column=0,sticky=tk.NSEW)
BUTTON2.grid(row=0,column=1,sticky=tk.NSEW)
LABEL1.grid(row=0,column=2,sticky=tk.NSEW)
CANVAS.grid(row=1,column=0, sticky=tk.NSEW, columnspan=4)
FRAME.grid_columnconfigure(3,weight=1)
FRAME.grid_rowconfigure(1,weight=1)

使用此解决方案,除了位置 row = 1 和 column = 3 之外的每一行和每一列都将具有小部件的大小(默认值 weight = 0)。第 3 列和第 1 列的权重 = 1。使用此设置,此“单元格”将扩展到帧的最大值,使用此设置也是 CANVAS,因为画布使用“单元格”(1|3)。

【讨论】:

  • 添加一个关于你做了什么以及它为什么起作用的简短解释将使这个答案更好。
  • 我将添加一个简短的解释。感谢您的提示。
【解决方案2】:

你不能以你想要的方式做你想做的事 - pack 不是为这样工作而设计的。

最简单、最直接的解决方案是为带有按钮的行使用框架。然后,您可以从左到右将按钮和标签打包在该框架内,然后将顶部的框架与下方的画布打包。

pack 工作方式的规范定义可以在官方 tcl/tk 手册页的 The packer algorithm 部分中看到。

例子:

import tkinter as tk

root = tk.Tk()

button_frame = tk.Frame(root)
BUTTON1 = tk.Button(button_frame, text="Button 1")
BUTTON2 = tk.Button(button_frame, text="Button 2")
LABEL1 = tk.Label(button_frame, text="Label 1")
CANVAS = tk.Canvas(root, background="bisque")

BUTTON1.pack(side="left")
BUTTON2.pack(side="left")
LABEL1.pack(side="left")

button_frame.pack(side="top", fill="x")
CANVAS.pack(side="top", fill="both", expand=True)

root.mainloop()

【讨论】:

  • 也感谢您的解决方案。
猜你喜欢
  • 2022-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2020-10-25
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
相关资源
最近更新 更多