簡體   English   中英

tkinter 網格布局和 label 高度

[英]tkinter grid layout and label hight

我有一個條目表單(在其他小部件中)有一個Entry小部件來輸入一些值和一個Listbox來顯示到目前為止輸入的有效值。 Entry小部件下方,我顯示了一條驗證消息(當值有效時為空,否則為錯誤描述)以及一個大符號( ''表示錯誤, ''表示有效)。

以下是通過單擊按鈕模擬有效和無效條目的最小示例:

import tkinter as tk

root = tk.Tk()

tk.Entry(root).grid(column=0, row=0, sticky=tk.N)
tk.Listbox(root, height=10).grid(column=1, row=0, rowspan=3, sticky=tk.N)

label = tk.Label(root)
label.grid(column=0, row=1, sticky=tk.N)

symbol = tk.Label(root, font='Arial 72 bold')
symbol.grid(column=0, row=2, sticky=tk.S)

def toggle():
    n = 0 if len(label['text']) > 10 else 3
    label['text'] = '\n'.join([f'error message line {i}' for i in range(n)])
    symbol['text'] = '🗴' if n else '🗸'
        
tk.Button(root, text='toggle message', command=toggle).grid(column=0, row=3)

root.mainloop()

在此處輸入圖像描述

當錯誤消息變長時,符號會向下移動,盡管在最后一個錯誤消息行的底部和符號頂部之間仍有足夠的空間。 原因是 72 pt 字體的最大字符高度可以使用這個額外的空間(可以通過在符號前插入一條完整的高度垂直線來輕松驗證。

除了減小符號字體大小(我不想要)或增加為消息和符號保留的總高度(我不能)之外,我看到了用圖像符號替換字符符號的唯一解決方法,其中筆畫延伸到整個圖像高度。

所以我的問題是:當消息行高度發生變化時,如何將按鈕保持在原位? 是否有可能以某種方式重疊符號和消息(知道符號字符筆划不會填充完整的字體高度)。 我嘗試了負填充,但 tkinter 不允許這樣做。 我也想堅持使用grid布局管理器。

通過調整第二行的大小以適應 window 高度並將grid_propagate設置為 False,然后按鈕保持原位:

import tkinter as tk

root = tk.Tk()

tk.Entry(root).grid(column=0, row=0, sticky=tk.N)
tk.Listbox(root, height=10).grid(column=1, row=0, rowspan=3, sticky=tk.N)

root.rowconfigure(2, weight=1)  # make second row resize to fit window height 
label = tk.Label(root)
label.grid(column=0, row=1, sticky=tk.N)

symbol = tk.Label(root, font='Arial 72 bold')
symbol.grid(column=0, row=2, sticky=tk.S)

def toggle():
    n = 0 if len(label['text']) > 10 else 3
    label['text'] = '\n'.join([f'error message line {i}' for i in range(n)])
    symbol['text'] = '🗴' if n else '🗸'

tk.Button(root, text='toggle message', command=toggle).grid(column=0, row=3)
root.update_idletasks()
root.grid_propagate(False)  # disable window resizing when its children change size
root.mainloop()

請注意,如果錯誤消息很長,則符號將不可見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM