gpt4 book ai didi

python - 在 Tkinter 网格中插入新行

转载 作者:行者123 更新时间:2023-12-03 21:26:10 28 4
gpt4 key购买 nike

假设我有一个 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()

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

电流输出:
Some Data
Some Data

预期输出:
Some Data
<<New data>>
Some Data
<<New Data>>将在稍后阶段插入作为对按钮单击的响应。
<<New 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()

结果:

enter image description here
enter image description here

这样做的原因是因为如果行和列中没有任何内容,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()

结果:

enter image description here

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

关于python - 在 Tkinter 网格中插入新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46340796/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com