在 tk/tkinter 中構建一個界面,該界面將由許多不同大小的框架組成,所有這些框架都將填充按鈕、標簽和文本欄位(大量的 frame.pack() 和 frame.destroy 正在進行)。我決定首先用 6x4 網格填充根框架,然后根據需要用臨時框架覆寫它。我的主要目標是根據用戶的縱橫比(遵守我建立的行/列權重)調整框架/標簽的大小,但是一旦傳播,邊界就會鎖定到位。
下面是我正在談論的內容的簡化示例(顏色僅用于間距/清晰度):
import random
class CharacterInterface:
def __init__(self, master):
self.display_text = ['']
self.master = master
self.master.attributes('-fullscreen', True)
self.master.title("Interface Template")
self.master.configure(bg='#000000')
# generates a 6x4 grid to underpin the interface/keep things spaced out
for i in range(6):
for j in range(4):
self.master.grid_columnconfigure(i, weight=1)
self.master.grid_rowconfigure(j, weight=1)
self.dummy_frame = tk.Frame(self.master, relief=tk.RIDGE, borderwidth=4,
bg='#' str(2 * j) str(2 * j) str(2 * j) str(i) str(i) str(i))
self.dummy_label = tk.Label(master=self.dummy_frame,
bg='#' str(i) str(i) str(i) str(2 * j) str(2 * j) str(2 * j))
self.dummy_frame.grid(row=j, column=i, sticky='nsew')
self.dummy_label.pack(ipadx=8, ipady=8, fill="both", expand=True)
self.ch_frame = tk.Frame(self.master, bg='#000077')
self.ch_frame.grid(row=0, column=0, rowspan=2, columnspan=3, sticky="nsew")
self.ch_frame.grid_propagate(False) # this locks ch_frame's right border
self.ch_frame.grid_columnconfigure(0, weight=1)
self.ch_frame.grid_columnconfigure(1, weight=3)
self.ch_frame.grid_rowconfigure(0, weight=1)
self.ch_frame.grid_rowconfigure(1, weight=6)
self.chtop_label = tk.Label(master=self.ch_frame, relief=tk.RIDGE, borderwidth=4, fg="#FFFFFF", bg='#000000',
font=('Courier', 12), justify="left", anchor='nw')
self.chtop_label.grid(row=0, column=0, columnspan=2, sticky='nsew')
self.chleft_label = tk.Label(master=self.ch_frame, relief=tk.RIDGE, borderwidth=4, fg="#FFFFFF", bg='#000000',
font=('Courier', 12), justify="left", anchor='nw')
self.chleft_label.grid(row=1, column=0, sticky='nsew')
self.chright_label = tk.Label(master=self.ch_frame, relief=tk.RIDGE, borderwidth=4, fg="#FFFFFF",
bg='#000000', font=('Courier', 12), justify="left", anchor='nw')
self.chright_label.grid(row=1, column=1, sticky='nsew')
self.test_button = tk.Button(self.chright_label, text="test", bg='#000000', fg="#FFFFFF",
font=('Courier', 12), relief=tk.FLAT, anchor='w', command=lambda: self.toss())
self.test_button.pack(side='left')
def toss(self):
self.test_button.pack_forget()
str_length, str_instance = random.randrange(1, 10), ""
for i in range(str_length):
str_instance = str_instance 'a'
self.chleft_label['text'] = str_instance
self.test_button.pack(side='left')
root = tk.Tk()
my_gui = CharacterInterface(root)
root.mainloop()
所以這里形成了 6x4 網格,并且 self.ch_frame.grid_propagate(False) 設定鎖定在 ch_frame (我創建的三個標簽的父框架)上的右邊框。但是如果你點擊按鈕,它會在 chleft_label 中創建一個小字串,中間的標簽邊框開始在我身上擺動。
有沒有辦法讓我在不使用 place() 或分配寬度值的情況下將邊框鎖定到位?我想我可以在 chleft_label 中粘貼一個占位符字串,但我更喜歡使用傳播命令而不是糟糕的解決方法來鎖定它(我將處理大量這些幀)。我也可以通過放棄 ch_frame 中的網格格式來解決它,但是我失去了一些我想要的核心功能(僅根據需要更新框架/標簽)。
這是一個死胡同,試圖在網格/包裝界面中斷言這種邊界定位嗎?
謝謝!
uj5u.com熱心網友回復:
@acw1668 搞定了——我只需要在我的 s.s 中添加一個uniform=1引數self.ch_frame.grid_columnconfigure()。檔案中的定義正盯著我看:
“分配屬于統一組的列的空間,以便它們的大小始終與它們的權重值嚴格成比例”
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/327499.html
