无法使用tkinters设计GUI打包我想要的方式

时间:2019-10-18 08:53:13

标签: python tkinter pack

我是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 -------------->

如何做到?

2 个答案:

答案 0 :(得分: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)。 >

答案 1 :(得分:0)

您无法按照自己的方式做自己想做的事-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()