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