Не могу дизайн GUI с пакетом Tkinters так, как я хочу - PullRequest
1 голос
/ 18 октября 2019

Я новичок в 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 -------------->

This:

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 ]

1 голос
/ 18 октября 2019

Решена проблема с подсказками Этана:

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)

При таком решении каждая строка и каждый столбец, кроме строки позиции = 1 и столбца = 3, будут иметь размер виджета (значение по умолчанию вес = 0). Оба столбца 3 и 1 имеют вес = 1. При этой настройке эта «ячейка» будет расширяться до максимума кадра, а при этой настройке также будет отображаться CANVAS, поскольку холст использует «ячейку» (1 | 3).

0 голосов
/ 18 октября 2019

Вы не можете делать то, что вы хотите, так, как вы хотите - pack не предназначен для такой работы.

Самое простое и простое решение - использовать рамку для строки с кнопками. Затем вы можете упаковать кнопки и метки внутри этой рамки слева направо, а затем упаковать рамку сверху с холстом под ней.

Каноническое определение того, как работает упаковка, можно увидеть в разделе Алгоритм упаковщика на официальных страницах руководства tcl / tk.

Пример:

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()
...