Python: tkinter - 如何动态生成网格?
Python: tkinter - how to dynamically generate grids?
我的应用程序应如下所示:
如果我在“左”按钮的 BasicWindow 中单击,然后在按钮“应用”处单击新窗口(应该是单独 class 中的某个小部件),在某个网格的单元格中( 4 列)按钮“Left”下方应出现 hello 一词。如果我重复n次,新词“你好”应该在“向左”按钮下方的网格中排列n次。
如果我在 BasicWindow 中单击“Right”按钮并在 NewWindow 中单击“apply”按钮,则在 Button“Left”下方的某个网格(4 列)的单元格中,单词 hello 应该出现。如果我重复n次,新词“你好”应该在“右键”按钮下方的网格中排列n次。
此图说明了程序应该做什么:
我刚刚尝试使用以下代码解决该问题:
from tkinter import *
class NewWindow(Toplevel):
def __init__(self, master = None, apply=None):
super().__init__(master = master)
self.title('NewWindow')
self.master = master
self.words = 'Hello'
self.bt1 = Button(self, text="apply", command=self.bt_press)
self.bt1.grid(column=0, row=0)
self.apply = apply
def bt_press(self):
self.apply(self.words)
self.destroy()
window = Tk()
def new_Editor(key):
def make_label1(lbl_txt):
lbl = Label(window, text=lbl_txt)
lbl.grid(column=0,row=2)
def make_label2(lbl_txt):
lbl = Label(window, text=lbl_txt)
lbl.grid(column=2,row=2)
if key == 1:
a = NewWindow(window, make_label1)
else:
a = NewWindow(window, make_label1)
window.title("BasicWindow")
window.basic_bt_l = Button(window, text="Left", command=lambda: new_Editor(1))
window.basic_bt_l.grid(column=0, row=0, columnspan=2)
window.basic_bt_r = Button(window, text="Right", command=lambda: new_Editor(2))
window.basic_bt_r.grid(column=1, row=0)
window.mainloop()
我的程序是这样的:
由于某些原因,这两个按钮的排列不是很好,输出的格式也不是很好。我怎样才能使用上面描述的属性在左右按钮和 Left/Right 按钮下方的两个网格之间定义一些格式良好的网格?
您在将root.basic_bt_l
添加到window时指定了columnspan=2
,因此它将占用第0列和第1列。然后您尝试将root.basic_bt_r
放在列中1,这将与第一个按钮重叠。
有时,如果将 grid
语句组合在一起,这些错误会更容易发现。请注意 columnspan
在这里如何突出,并使布局更容易可视化
root.basic_bt_l.grid(column=0, row=0, columnspan=2)
root.basic_bt_r.grid(column=1, row=0)
您需要删除 columnspan=2
以使按钮不重叠。
至于在新行上添加新词,您需要计算将新标签放置在哪一行。在这种特定情况下,由于您垂直堆叠标签并且永远不会从中间移除它们,因此您可以使用 grid_slaves
方法来告诉您有多少标签。您可以将该数字加一以获得该列的第一个空行。您也可以只记录为每列添加了多少标签。
您还需要确保调用 make_label2
- 您在 if
语句的两种情况下都调用 make_label1
。
def new_Editor(key):
def make_label1(lbl_txt):
print("root.grid_slaves(0):", root.grid_slaves(column=0))
row = len(root.grid_slaves(column=0))+1
lbl = Label(root, text=lbl_txt)
lbl.grid(row=row, column=0)
def make_label2(lbl_txt):
print("root.grid_slaves(1):", root.grid_slaves(column=1))
row = len(root.grid_slaves(column=1))+1
lbl = Label(root, text=lbl_txt)
lbl.grid(row=row, column=1)
if key == 1:
a = NewWindow(root, make_label1)
else:
a = NewWindow(root, make_label2)
我的应用程序应如下所示:
如果我在“左”按钮的 BasicWindow 中单击,然后在按钮“应用”处单击新窗口(应该是单独 class 中的某个小部件),在某个网格的单元格中( 4 列)按钮“Left”下方应出现 hello 一词。如果我重复n次,新词“你好”应该在“向左”按钮下方的网格中排列n次。
如果我在 BasicWindow 中单击“Right”按钮并在 NewWindow 中单击“apply”按钮,则在 Button“Left”下方的某个网格(4 列)的单元格中,单词 hello 应该出现。如果我重复n次,新词“你好”应该在“右键”按钮下方的网格中排列n次。
此图说明了程序应该做什么:
我刚刚尝试使用以下代码解决该问题:
from tkinter import *
class NewWindow(Toplevel):
def __init__(self, master = None, apply=None):
super().__init__(master = master)
self.title('NewWindow')
self.master = master
self.words = 'Hello'
self.bt1 = Button(self, text="apply", command=self.bt_press)
self.bt1.grid(column=0, row=0)
self.apply = apply
def bt_press(self):
self.apply(self.words)
self.destroy()
window = Tk()
def new_Editor(key):
def make_label1(lbl_txt):
lbl = Label(window, text=lbl_txt)
lbl.grid(column=0,row=2)
def make_label2(lbl_txt):
lbl = Label(window, text=lbl_txt)
lbl.grid(column=2,row=2)
if key == 1:
a = NewWindow(window, make_label1)
else:
a = NewWindow(window, make_label1)
window.title("BasicWindow")
window.basic_bt_l = Button(window, text="Left", command=lambda: new_Editor(1))
window.basic_bt_l.grid(column=0, row=0, columnspan=2)
window.basic_bt_r = Button(window, text="Right", command=lambda: new_Editor(2))
window.basic_bt_r.grid(column=1, row=0)
window.mainloop()
我的程序是这样的:
由于某些原因,这两个按钮的排列不是很好,输出的格式也不是很好。我怎样才能使用上面描述的属性在左右按钮和 Left/Right 按钮下方的两个网格之间定义一些格式良好的网格?
您在将root.basic_bt_l
添加到window时指定了columnspan=2
,因此它将占用第0列和第1列。然后您尝试将root.basic_bt_r
放在列中1,这将与第一个按钮重叠。
有时,如果将 grid
语句组合在一起,这些错误会更容易发现。请注意 columnspan
在这里如何突出,并使布局更容易可视化
root.basic_bt_l.grid(column=0, row=0, columnspan=2)
root.basic_bt_r.grid(column=1, row=0)
您需要删除 columnspan=2
以使按钮不重叠。
至于在新行上添加新词,您需要计算将新标签放置在哪一行。在这种特定情况下,由于您垂直堆叠标签并且永远不会从中间移除它们,因此您可以使用 grid_slaves
方法来告诉您有多少标签。您可以将该数字加一以获得该列的第一个空行。您也可以只记录为每列添加了多少标签。
您还需要确保调用 make_label2
- 您在 if
语句的两种情况下都调用 make_label1
。
def new_Editor(key):
def make_label1(lbl_txt):
print("root.grid_slaves(0):", root.grid_slaves(column=0))
row = len(root.grid_slaves(column=0))+1
lbl = Label(root, text=lbl_txt)
lbl.grid(row=row, column=0)
def make_label2(lbl_txt):
print("root.grid_slaves(1):", root.grid_slaves(column=1))
row = len(root.grid_slaves(column=1))+1
lbl = Label(root, text=lbl_txt)
lbl.grid(row=row, column=1)
if key == 1:
a = NewWindow(root, make_label1)
else:
a = NewWindow(root, make_label2)