使用 Tkinter 包管理器定位动态添加的标签
Positioning dynamically added labels using Tkinter pack manager
我正在尝试 pack()
按下按钮后动态标记。但出于某种原因,这些标签被添加到被单击的按钮下方,而不是按钮所在的整个框架下方,即使新标签的母版是按钮的母版。
我尝试使用许多 side
和 anchor
选项组合,但似乎没有任何效果如我所愿。
工作示例及其输出:
from tkinter import *
class AddSButton(Button):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.config(command=self.click_function)
def click_function(self):
# for item in self.master.winfo_children():
l = Label(self.master, text="texttexttext")
l.pack(anchor=W)
class Application(Frame):
def __init__(self, master=None):
self.setLounge = 21.0
Frame.__init__(self, master)
self.frame = LabelFrame(self.master)
self.frame.grid(row=0, column=0)
self.frame_input_sc = LabelFrame(self.frame)
self.frame_input_sc.pack()
self.input_s_id = Entry(self.frame_input_sc, width=3, borderwidth=3)
self.input_s_id.grid(row=0, column=0) # columnspan=3, , sticky=W+E
self.input_s_id.insert(0, "Id")
self.input_s_name = Entry(self.frame_input_sc, width=20, borderwidth=3)
self.input_s_name.grid(row=0, column=1)
self.input_s_name.insert(0, "Enter text...")
btn_add_sc = Button(self.frame_input_sc, text="Add", command=self.add_sc_clicked)
btn_add_sc.grid(row=0, column=2)
def add_sc_clicked(self):
sc = self.input_s_name.get().strip()
id = self.input_s_id.get().strip()
frame_s = LabelFrame(self.frame)
frame_s.pack(fill=X)
lbl_s_id = Label(frame_s, text=id + " ")
lbl_s_name = Label(frame_s, text=sc)
lbl_s_id.grid(row=0, column=0, sticky=N + S)
lbl_s_name.grid(row=0, column=1, sticky=N + S)
frame_add_step = LabelFrame(frame_s)
frame_add_step.grid(row=1, column=0, columnspan=2, sticky=N + S + W + E)
input_s = Entry(frame_add_step, width=50, borderwidth=3)
input_s.pack(side=LEFT, anchor=NW)
input_s.insert(0, "Enter s...")
btn_add_s = AddSButton(frame_add_step, text="Add")
btn_add_s.pack(fill=X, anchor=NW)
root = Tk()
app = Application(master=root)
app.mainloop()
您已将条目小部件添加到 frame_add_step
的左侧,这导致它被分配到框架的整个左侧。所有新的小部件都将添加到条目小部件的右侧。这是打包程序工作原理的一个基本方面。
您要么需要将条目和“添加”按钮放在包装到 frame_add_step
顶部的框架中,以便标签可以包装在下面,要么您需要使用 grid
.
我正在尝试 pack()
按下按钮后动态标记。但出于某种原因,这些标签被添加到被单击的按钮下方,而不是按钮所在的整个框架下方,即使新标签的母版是按钮的母版。
我尝试使用许多 side
和 anchor
选项组合,但似乎没有任何效果如我所愿。
工作示例及其输出:
from tkinter import *
class AddSButton(Button):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.config(command=self.click_function)
def click_function(self):
# for item in self.master.winfo_children():
l = Label(self.master, text="texttexttext")
l.pack(anchor=W)
class Application(Frame):
def __init__(self, master=None):
self.setLounge = 21.0
Frame.__init__(self, master)
self.frame = LabelFrame(self.master)
self.frame.grid(row=0, column=0)
self.frame_input_sc = LabelFrame(self.frame)
self.frame_input_sc.pack()
self.input_s_id = Entry(self.frame_input_sc, width=3, borderwidth=3)
self.input_s_id.grid(row=0, column=0) # columnspan=3, , sticky=W+E
self.input_s_id.insert(0, "Id")
self.input_s_name = Entry(self.frame_input_sc, width=20, borderwidth=3)
self.input_s_name.grid(row=0, column=1)
self.input_s_name.insert(0, "Enter text...")
btn_add_sc = Button(self.frame_input_sc, text="Add", command=self.add_sc_clicked)
btn_add_sc.grid(row=0, column=2)
def add_sc_clicked(self):
sc = self.input_s_name.get().strip()
id = self.input_s_id.get().strip()
frame_s = LabelFrame(self.frame)
frame_s.pack(fill=X)
lbl_s_id = Label(frame_s, text=id + " ")
lbl_s_name = Label(frame_s, text=sc)
lbl_s_id.grid(row=0, column=0, sticky=N + S)
lbl_s_name.grid(row=0, column=1, sticky=N + S)
frame_add_step = LabelFrame(frame_s)
frame_add_step.grid(row=1, column=0, columnspan=2, sticky=N + S + W + E)
input_s = Entry(frame_add_step, width=50, borderwidth=3)
input_s.pack(side=LEFT, anchor=NW)
input_s.insert(0, "Enter s...")
btn_add_s = AddSButton(frame_add_step, text="Add")
btn_add_s.pack(fill=X, anchor=NW)
root = Tk()
app = Application(master=root)
app.mainloop()
您已将条目小部件添加到 frame_add_step
的左侧,这导致它被分配到框架的整个左侧。所有新的小部件都将添加到条目小部件的右侧。这是打包程序工作原理的一个基本方面。
您要么需要将条目和“添加”按钮放在包装到 frame_add_step
顶部的框架中,以便标签可以包装在下面,要么您需要使用 grid
.