如何在主 window 打开时更新顶层树视图?
How to update toplevel treeview from the main window while it is open?
这个问题是每次我点击 提交 按钮,我需要关闭并再次打开 toplevel 才能看到输入的数据。我只是想在单击 submit 按钮后自动更新 treeview 而 toplevel treeview 已打开。解决方案是什么?
这是我的代码:
from tkinter import *
from tkinter import ttk
class win1:
def __init__(self, master):
self.master = master
self.master.geometry('200x200+0+0')
self.fullname = StringVar()
self.age = StringVar()
self.example_lst = [('John', 12), ('Hannah', 10)]
self.lblname = Label(self.master, text='Name:')
self.lblname.pack()
self.entryname = Entry(self.master, textvariable=self.fullname)
self.entryname.pack()
self.lblage = Label(self.master, text='Age:')
self.lblage.pack()
self.entryage = Entry(self.master, textvariable=self.age)
self.entryage.pack()
self.btn1 = Button(self.master, text='Submit', command=self.submit)
self.btn1.pack()
self.btn2 = Button(self.master, text='Open window', command=self.openwin)
self.btn2.pack()
def submit(self):
self.example_lst.append((self.fullname.get(), self.age.get()))
self.fullname.set('')
self.age.set('')
def openwin(self):
self.openwin2 = Toplevel(self.master)
app = win2(self.openwin2, self)
class win2:
def __init__(self, master, mainwin):
self.master = master
self.mainwin = mainwin
self.master.geometry('300x300+100+100')
self.t_scroll = Scrollbar(self.master)
self.t_scroll.pack(side=RIGHT, fill=Y)
self.t_table = ttk.Treeview(self.master, yscrollcommand=self.t_scroll.set)
self.t_scroll.config(command=self.t_table.yview)
self.t_table['column'] = ('Name', 'Age')
self.t_table.column('#0', width=0, stretch=NO)
self.t_table.column('Name', width=50, minwidth=30)
self.t_table.column('Age', width=30, minwidth=30)
headings = ['#0', 'Name', 'Age']
txt_headings = ['', 'Name', 'Age']
for i in range(len(headings)):
self.t_table.heading(headings[i], text=f'{txt_headings[i]}', anchor=W)
for x in self.mainwin.example_lst:
self.t_table.insert(parent='', index='end', values=x)
self.t_table.pack()
def main():
root = Tk()
app = win1(root)
root.mainloop()
if __name__ == '__main__':
main()
有趣的练习。我在代码中添加了一些注释,但保留了大部分内容。
要更新另一个 window,您必须为另一个 window 创建一个方法来执行您需要的操作。
update_tree
只会将最后添加的人添加到树中。
from tkinter import *
from tkinter import ttk
class win1:
def __init__(self, master):
self.master = master
self.master.geometry('200x200+0+0')
# Initialize app (second window)
self.app = None
self.fullname = StringVar()
self.age = StringVar()
self.example_lst = [('John', 12), ('Hannah', 10)]
self.lblname = Label(self.master, text='Name:')
self.lblname.pack()
self.entryname = Entry(self.master, textvariable=self.fullname)
self.entryname.pack()
self.lblage = Label(self.master, text='Age:')
self.lblage.pack()
self.entryage = Entry(self.master, textvariable=self.age)
self.entryage.pack()
self.btn1 = Button(self.master, text='Submit', command=self.submit)
self.btn1.pack()
self.btn2 = Button(self.master, text='Open window', command=self.openwin)
self.btn2.pack()
def submit(self):
self.example_lst.append((self.fullname.get(), self.age.get()))
self.fullname.set('')
self.age.set('')
# Add update to app in the submit button.
if self.app is not None:
self.app.update_tree()
def openwin(self):
openwin2 = Toplevel(self.master)
self.app = win2(openwin2, self)
class win2:
def __init__(self, master, mainwin):
self.master = master
self.mainwin = mainwin
self.master.geometry('300x300+100+100')
self.t_scroll = Scrollbar(self.master)
self.t_scroll.pack(side=RIGHT, fill=Y)
self.t_table = ttk.Treeview(self.master, yscrollcommand=self.t_scroll.set)
self.t_scroll.config(command=self.t_table.yview)
self.t_table['column'] = ('Name', 'Age')
self.t_table.column('#0', width=0, stretch=NO)
self.t_table.column('Name', width=50, minwidth=30)
self.t_table.column('Age', width=30, minwidth=30)
headings = ['#0', 'Name', 'Age']
txt_headings = ['', 'Name', 'Age']
for heading in zip(headings, txt_headings):
self.t_table.heading(heading[0], text=f'{heading[1]}', anchor=W)
# Initialize the example list data.
self.load_init()
self.t_table.pack()
def load_init(self):
for x in range(len(self.t_table.children), len(self.mainwin.example_lst)):
self.t_table.insert(parent='', index='end', values=self.mainwin.example_lst[x])
def update_tree(self):
self.t_table.insert(parent='', index='end', values=self.mainwin.example_lst[-1])
def main():
root = Tk()
app = win1(root)
root.mainloop()
if __name__ == '__main__':
main()
这个问题是每次我点击 提交 按钮,我需要关闭并再次打开 toplevel 才能看到输入的数据。我只是想在单击 submit 按钮后自动更新 treeview 而 toplevel treeview 已打开。解决方案是什么?
这是我的代码:
from tkinter import *
from tkinter import ttk
class win1:
def __init__(self, master):
self.master = master
self.master.geometry('200x200+0+0')
self.fullname = StringVar()
self.age = StringVar()
self.example_lst = [('John', 12), ('Hannah', 10)]
self.lblname = Label(self.master, text='Name:')
self.lblname.pack()
self.entryname = Entry(self.master, textvariable=self.fullname)
self.entryname.pack()
self.lblage = Label(self.master, text='Age:')
self.lblage.pack()
self.entryage = Entry(self.master, textvariable=self.age)
self.entryage.pack()
self.btn1 = Button(self.master, text='Submit', command=self.submit)
self.btn1.pack()
self.btn2 = Button(self.master, text='Open window', command=self.openwin)
self.btn2.pack()
def submit(self):
self.example_lst.append((self.fullname.get(), self.age.get()))
self.fullname.set('')
self.age.set('')
def openwin(self):
self.openwin2 = Toplevel(self.master)
app = win2(self.openwin2, self)
class win2:
def __init__(self, master, mainwin):
self.master = master
self.mainwin = mainwin
self.master.geometry('300x300+100+100')
self.t_scroll = Scrollbar(self.master)
self.t_scroll.pack(side=RIGHT, fill=Y)
self.t_table = ttk.Treeview(self.master, yscrollcommand=self.t_scroll.set)
self.t_scroll.config(command=self.t_table.yview)
self.t_table['column'] = ('Name', 'Age')
self.t_table.column('#0', width=0, stretch=NO)
self.t_table.column('Name', width=50, minwidth=30)
self.t_table.column('Age', width=30, minwidth=30)
headings = ['#0', 'Name', 'Age']
txt_headings = ['', 'Name', 'Age']
for i in range(len(headings)):
self.t_table.heading(headings[i], text=f'{txt_headings[i]}', anchor=W)
for x in self.mainwin.example_lst:
self.t_table.insert(parent='', index='end', values=x)
self.t_table.pack()
def main():
root = Tk()
app = win1(root)
root.mainloop()
if __name__ == '__main__':
main()
有趣的练习。我在代码中添加了一些注释,但保留了大部分内容。
要更新另一个 window,您必须为另一个 window 创建一个方法来执行您需要的操作。
update_tree
只会将最后添加的人添加到树中。
from tkinter import *
from tkinter import ttk
class win1:
def __init__(self, master):
self.master = master
self.master.geometry('200x200+0+0')
# Initialize app (second window)
self.app = None
self.fullname = StringVar()
self.age = StringVar()
self.example_lst = [('John', 12), ('Hannah', 10)]
self.lblname = Label(self.master, text='Name:')
self.lblname.pack()
self.entryname = Entry(self.master, textvariable=self.fullname)
self.entryname.pack()
self.lblage = Label(self.master, text='Age:')
self.lblage.pack()
self.entryage = Entry(self.master, textvariable=self.age)
self.entryage.pack()
self.btn1 = Button(self.master, text='Submit', command=self.submit)
self.btn1.pack()
self.btn2 = Button(self.master, text='Open window', command=self.openwin)
self.btn2.pack()
def submit(self):
self.example_lst.append((self.fullname.get(), self.age.get()))
self.fullname.set('')
self.age.set('')
# Add update to app in the submit button.
if self.app is not None:
self.app.update_tree()
def openwin(self):
openwin2 = Toplevel(self.master)
self.app = win2(openwin2, self)
class win2:
def __init__(self, master, mainwin):
self.master = master
self.mainwin = mainwin
self.master.geometry('300x300+100+100')
self.t_scroll = Scrollbar(self.master)
self.t_scroll.pack(side=RIGHT, fill=Y)
self.t_table = ttk.Treeview(self.master, yscrollcommand=self.t_scroll.set)
self.t_scroll.config(command=self.t_table.yview)
self.t_table['column'] = ('Name', 'Age')
self.t_table.column('#0', width=0, stretch=NO)
self.t_table.column('Name', width=50, minwidth=30)
self.t_table.column('Age', width=30, minwidth=30)
headings = ['#0', 'Name', 'Age']
txt_headings = ['', 'Name', 'Age']
for heading in zip(headings, txt_headings):
self.t_table.heading(heading[0], text=f'{heading[1]}', anchor=W)
# Initialize the example list data.
self.load_init()
self.t_table.pack()
def load_init(self):
for x in range(len(self.t_table.children), len(self.mainwin.example_lst)):
self.t_table.insert(parent='', index='end', values=self.mainwin.example_lst[x])
def update_tree(self):
self.t_table.insert(parent='', index='end', values=self.mainwin.example_lst[-1])
def main():
root = Tk()
app = win1(root)
root.mainloop()
if __name__ == '__main__':
main()