Python: tkinter - 如何动态生成网格?

Python: tkinter - how to dynamically generate grids?

我的应用程序应如下所示:

此图说明了程序应该做什么:

我刚刚尝试使用以下代码解决该问题:

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)