LINUX.ORG.RU

python && tk: как правильно упаковывать виджеты


0

0

Решил поиграться с Python + Tk, но что-то буксую на правильной упаковке виджетов. Код ниже.

После запуска приложение выглядит так. Что сразу анноит:

  1. Центрирование Label+Entry происходит по вертикали. Хочу чтобы каждая пара Label+Entry была «прижата» к верху и чтобы между парами не было таких огромных пустых пространств.
  2. При растягивании окна получается вот такая фигня. Как сделать хотя бы «резиновую» упаковку, чтобы размеры виджетов также увеличивались пропорционально (а-ля Qt, при помещении в layout'ы) и не было этих некрасивых пустых пробелов до границ окна?
  3. При уменьшении размеров окна получается вот такое. Как запретить, чтобы виджеты «не терялись» при ресайзе, кроме как делать fixed size окна?

Продолжаю читать документацию по Tkinter, буду благодарен если не только ткнёте носом в ошибку, но еще и объясните немного :). Спасибо.

#!/usr/bin/env python

import Tkinter as Tk

def main():
    root = Tk.Tk()
    root.title("Python::Tk test")

    fr1 = Tk.Frame(root)
    l1 = Tk.Label(fr1, text = "Label 1")
    e1 = Tk.Entry(fr1)
    l1.pack(side = Tk.LEFT)
    e1.pack(side = Tk.LEFT)
    fr1.grid(row = 0, column = 0, columnspan = 2, padx = 10)

    fr2 = Tk.Frame(root)
    l2 = Tk.Label(fr2, text = "Label 2")
    e2 = Tk.Entry(fr2)
    l2.pack(side = Tk.LEFT)
    e2.pack(side = Tk.LEFT)
    fr2.grid(row = 1, column = 0, columnspan = 2, padx = 10)

    fr3 = Tk.Frame(root)
    l3 = Tk.Label(fr3, text = "Label 3")
    e3 = Tk.Entry(fr3)
    l3.pack(side = Tk.LEFT)
    e3.pack(side = Tk.LEFT)
    fr3.grid(row = 2, column = 0, columnspan = 2, padx = 10)

    quit = Tk.Button(root, text = "Quit")
    quit.grid(row = 5, column = 0, sticky = Tk.W + Tk.S)

    blah = Tk.Button(root, text = "Blah!")
    blah.grid(row = 5, column = 2, sticky = Tk.E + Tk.S)

    canvas = Tk.Canvas(root, width = 500, height = 500, bg = "white")
    canvas.grid(row = 0, column = 3, columnspan = 4, rowspan = 4)
    
    root.mainloop()

if "__main__" == __name__:
    main()
★★★

Во-первых, выбери один geometry manager, а не мешай между собой grid и pack. Лучше grid, т.к. он посильнее.
Во-вторых, почитай про grid columnconfigure/rowconfigure (уж не знаю, как это на питоне описывается) для "резинового" расположения (а именно -weight X).
В-третьих, используй ключ -sticky (и параметр обычно nswe) у grid для прилепивания виджета к краям ячёйки грида, в которых он находится.

gaa ★★
()
Ответ на: комментарий от trapezoid

> Я всегда pack использую. что в GTK+, что в Tk. Не знаю, может, я сильно не прав :-)

Ну это твои проблемы в принципе ;)
Но текстовое поле с вертикальным и горизонтальным скроллбаром на паке ты сделать просто не сможешь без извращений. В то время как на гриде всё легко:

package require Tk
grid columnconfigure . 0 -weight 1
grid rowconfigure . 0 -weight 1
grid [ text .t ] [ scrollbar .y -orient vertical -command ".t yview" ] -sticky nswe
grid [ scrollbar .x -orient horizontal -command ".t xview" ] x -sticky nswe
.t configure -xscrollcommand ".x set" -yscrollcommand ".y set"

gaa ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.