【发布时间】:2021-08-07 06:51:26
【问题描述】:
我正在尝试在 tkinter Treeview 中插入新条目,但它不起作用并且没有显示任何错误。
以下是我的代码的小版本。
class First:
...
...
for c in self.bill_tree.get_children():
i = self.bill_tree.item(c)['values']
Second().add_to_tree(i)
...
...
我想做的是让First 班级的孩子,然后将他们插入Second 班级,但它不起作用。我创建了一个add 方法来测试并插入数据,但是当我尝试使用add_to_tree 时它失败了。
class Second:
....
self.bill_tree1 = ttk.Treeview(self, show='tree')
tree_scroll_y = tk.Scrollbar(self, orient='vertical', command=self.bill_tree1.yview)
self.bill_tree1.config(yscrollcommand=tree_scroll_y.set, columns=('#0','#1','#2','#3''))
self.bill_tree1.column("#0", stretch='no', minwidth=0, width=0)
self.bill_tree1.column("#1", stretch='no', minwidth=0, width=40, anchor='center')
self.bill_tree1.column("#2", stretch='no', minwidth=0, width=180, anchor='w')
self.bill_tree1.column("#3", stretch='no', minwidth=0, width=90, anchor='center')
tree_scroll_y.place(relx=0.578, rely=0.186,width=20, height=299)
self.bill_tree1.place(relx=0.013,rely=0.185, width=780, height=301)
def add(self):
self.bill_tree1.insert('','end', values=('value 1','value 2','value 3'))
def add_to_tree(self, i):
self.bill_tree1.insert('','end', values=(i))
以下是我的项目的迷你示例,其中所有类都是从主类调用创建的,并相互叠加以实现多页窗口。
from tkinter import ttk, messagebox
import tkinter as tk
class Home(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(fill='both', expand=True)
l = [[1,2,3],[4,5,6]]
Second().add_to_tree(l)
self.frames = {}
for F in (Second, First):
frame = F(container, self)
self.frames[F] = frame
frame.configure(width=1344, height=750)
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(First)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class First(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
l = [[1,2,3],[4,5,6]]
Second().add_to_tree(l)
tk.Button(self, text='add', command=lambda: controller.show_frame(Second)).pack()
class Second(tk.Frame):
def __init__(self, parent=None, controller=None):
tk.Frame.__init__(self, parent)
self.bill_tree1 = ttk.Treeview(self, show='tree')
tree_scroll_y = tk.Scrollbar(self, orient='vertical', command=self.bill_tree1.yview)
self.bill_tree1.config(yscrollcommand=tree_scroll_y.set, columns=('#0','#1','#2','#3'))
self.bill_tree1.column("#0", stretch='no', minwidth=0, width=0)
self.bill_tree1.column("#1", stretch='no', minwidth=0, width=40, anchor='center')
self.bill_tree1.column("#2", stretch='no', minwidth=0, width=180, anchor='w')
self.bill_tree1.column("#3", stretch='no', minwidth=0, width=90, anchor='center')
tree_scroll_y.place(relx=0.578, rely=0.186,width=20, height=299)
self.bill_tree1.place(relx=0.013,rely=0.185, width=780, height=301)
# tk.Button(self, text='add 1', command=self.add).grid()
def add(self):
self.bill_tree1.insert('','end', values=('value 1','value 2','value 3'))
def add_to_tree(self, i):
self.bill_tree1.insert('','end', values=(i))
if __name__ == "__main__":
app = Home()
app.geometry('1300x700')
app.mainloop()
我需要将数据发送到二等舱
【问题讨论】:
-
语句
Second().add_to_tree(i)创建了一个Second的实例,它创建了一个Treeview然后它向它添加了一些东西循环的每次迭代所以有一堆正在创建的单独的Treeview小部件彼此无关。您需要创建一个Treeview小部件并在其中插入多个项目 - 所以也许应该只在循环外创建一个Second实例。 -
@martineau 先生,我尝试了您的建议,将代码更改为
l = []for c in self.bill_tree.get_children():l.append(self.bill_tree.item(c)['values'])Second().add_to_tree(l)然后通过循环插入add_to_code但不起作用 -
对不起,我真的看不懂。但是,您似乎仍在创建
Second类的多个实例。如果您编辑了您的问题并提供了一个可运行的minimal reproducible example (MRE),那将是最好的。 -
您只需创建一次实例
s = Second(),然后将其作为参数发送到其他类 -First(s)和def __init__(self, s): self.s = s和self.s.add_to_tree(i) -
先生,请检查我的问题,我添加了我的项目的迷你版