在 tkinter 中摇晃边界
Jiggling borders in tkinter
在 tk/tkinter 中构建一个界面,该界面将由许多不同大小的框架组成,所有框架都将填充按钮、标签和文本字段(很多 frame.pack() & frame.destroy 继续)。我决定首先用 6x4 网格填充根框架,然后根据需要用临时框架覆盖它。我的主要目标是根据用户的宽高比(遵守我建立的 row/column 权重)缩小 frames/labels 大小,然后在传播后将边框锁定到位。
下面是我所说内容的简化示例(颜色仅适用于 spacing/clarity):
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 中的网格格式来解决它,但是我失去了一些我想要的核心功能(只根据需要更新 frames/labels)。
这是一个死胡同吗,试图在 grid/pack 界面中断言这种边界定位?
谢谢!
@acw1668 成功了——我只需要在我的 self.ch_frame.grid_columnconfigure()
中添加一个 uniform=1
参数。文档中的定义正盯着我看:
“分配属于统一组的列的 space,以便它们的大小始终与其权重值严格成比例”
在 tk/tkinter 中构建一个界面,该界面将由许多不同大小的框架组成,所有框架都将填充按钮、标签和文本字段(很多 frame.pack() & frame.destroy 继续)。我决定首先用 6x4 网格填充根框架,然后根据需要用临时框架覆盖它。我的主要目标是根据用户的宽高比(遵守我建立的 row/column 权重)缩小 frames/labels 大小,然后在传播后将边框锁定到位。
下面是我所说内容的简化示例(颜色仅适用于 spacing/clarity):
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 中的网格格式来解决它,但是我失去了一些我想要的核心功能(只根据需要更新 frames/labels)。
这是一个死胡同吗,试图在 grid/pack 界面中断言这种边界定位?
谢谢!
@acw1668 成功了——我只需要在我的 self.ch_frame.grid_columnconfigure()
中添加一个 uniform=1
参数。文档中的定义正盯着我看:
“分配属于统一组的列的 space,以便它们的大小始终与其权重值严格成比例”