在 Tkinter 网格中插入新行

Joe*_*Joe 4 python tkinter

假设我有一个 Tkinter 应用程序,其中 2 行显示 2 个小部件:

from tkinter import *
from tkinter.ttk import *
root = Tk()
Label(root, text="Some Data").grid(row=0)
Label(root, text="Some Data").grid(row=1)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

现在这将在 row0 和 row1 上显示两个小部件。现在,如果我想稍后在这两行之间插入另一个(一个或多个)小部件(比如作为对按钮单击事件的响应),那么最好的方法是什么。

电流输出:

Some Data
Some Data
Run Code Online (Sandbox Code Playgroud)

预期输出:

Some Data
<<New data>>
Some Data
Run Code Online (Sandbox Code Playgroud)

<<New Data>> 将在稍后阶段插入作为对按钮单击的响应。

<<New Data>> 可以是一行或多行。

Mik*_*SMT 6

我确实为您提供了一个简单的解决方案。

如果您希望稍后插入一个小部件并且您知道您会这样做,那么您可以简单地将第二个标签放在网格第 2 行,然后稍后将新的小部件放在网格第 1 行。如果您需要多于一行,您可以将第二个标签放在更靠后的位置。

from tkinter import *
from tkinter.ttk import *
root = Tk()

def add_new_data():
    Label(root, text="<<New Data>>").grid(row=1)

Label(root, text="Some Data").grid(row=0)
Label(root, text="Some Data").grid(row=2)

Button(root, text="Add New Data", command=add_new_data).grid(row=3)

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明 在此处输入图片说明

这样做的原因是因为如果行和列中没有任何内容,Tkinter 的几何管理器会将行和列折叠为空,因此您可以在处理此类事情时利用此行为。


现在,如果您想要一些可以与任意数量标签一起使用的东西,那么我们可以使用列表来帮助我们实现这一目标。

我的下一个例子是在课堂上编写的,将展示使用列表来做我们想做的事情。

我们可以将小部件存储在列表中,因为我们可以这样做,我们还可以决定在该列表中放置内容的位置,并在设置网格时使用列表索引。

首先是创建我们的Some Data标签并将它们附加到列表中。接下来是将按钮添加到列表末尾的列表中。我们将使用此按钮调用一个类方法,该方法将insert()一个新标签添加到我们的列表中。

接下来,同样的方法将忘记我们标签框架内所有小部件的网格,然后它将for对列表执行循环,并以正确的顺序重新添加所有旧小部件和新小部件。

看看下面的例子。

import tkinter as tk


class App(tk.Frame):

    def __init__(self, master, *args, **kwargs):
        tk.Frame.__init__(self, master, *args, **kwargs)
        self.master = master
        self.label_frame = tk.Frame(self.master)
        self.label_frame.grid()

        self.label_list = []

        for i in range(2):
            self.label_list.append(tk.Label(self.label_frame, text="Some Data"))
            self.label_list[i].grid(row=i)

        self.label_list.append(tk.Button(self.label_frame, text="Add new data", command=self.add_new_data))
        self.label_list[2].grid(row=2)

    def add_new_data(self):
        self.label_list.insert(1, tk.Label(self.label_frame, text="<<New Data>>"))

        for widget in self.label_frame.children.values():
            widget.grid_forget() 

        for ndex, i in enumerate(self.label_list):
            i.grid(row=ndex)


if __name__ == "__main__":
    root = tk.Tk() 
    my_app = App(root)
    root.mainloop()
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

我们可以添加任意数量的新标签。