Python 在Tkinter网格中插入新行

Python 在Tkinter网格中插入新行,python,tkinter,Python,Tkinter,假设我有一个Tkinter应用程序,有两行显示两个小部件: 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() 现在将在第0行和第1行上显示两个小部件。 现在,如果我想在稍后阶段在这两行之间插入另一个(一个或多个)小部件(比如作为

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

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()
现在将在第0行和第1行上显示两个小部件。 现在,如果我想在稍后阶段在这两行之间插入另一个(一个或多个)小部件(比如作为对按钮单击事件的响应),那么最好的方法是什么

电流输出:

Some Data
Some Data
预期产出:

Some Data
<<New data>>
Some Data
一些数据
一些数据
将在稍后阶段作为对按钮单击的响应插入


可以是一行或多行。

我有一个简单的解决方案

如果您希望稍后插入一个小部件,并且您知道您会这样做,那么您可以简单地将第二个标签放在网格第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()
结果:


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

看看这个答案->。@BasJansen这就完成了任务。但出于好奇,这是最好的方法吗?我会暗中相信布莱恩·奥克利对特金特的回答,这是他采用的标签。是的,我真的很擅长特金特,但这只是因为布莱恩的无数详细答案。我也相信他的建议,没有任何疑问。嗨,乔,我在我的答案中添加了一个更新,这样你就可以看到你可能希望如何编写你的程序,以便能够添加尽可能多的标签。非常感谢你的回答。您的解决方案的第二部分看起来非常优雅,我可以在我的应用程序中使用它,只需稍作调整。@Joe很乐意帮助:)
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()