我有一個帶有(在其他小部件中)一個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布局管理器。
uj5u.com熱心網友回復:
通過調整第二行的大小以適應視窗高度并設定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()
請注意,如果錯誤訊息很長,則符號將不可見。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/416041.html
標籤:
上一篇:將單選按鈕的文本定位在其左側
