Python 如何在主窗口打开时从主窗口更新顶级树状视图?

Python 如何在主窗口打开时从主窗口更新顶级树状视图?,python,tkinter,treeview,Python,Tkinter,Treeview,问题是,每次单击“提交”按钮时,我都需要关闭并再次打开顶层以查看输入的数据。我只是想在顶级树状视图打开时单击“提交”按钮后自动更新树状视图。解决这个问题的办法是什么 这是我的代码: from tkinter import * from tkinter import ttk class win1: def __init__(self, master): self.master = master self.master.geometry('200x200+0

问题是,每次单击“提交”按钮时,我都需要关闭并再次打开顶层以查看输入的数据。我只是想在顶级树状视图打开时单击“提交”按钮后自动更新树状视图。解决这个问题的办法是什么

这是我的代码:

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()

有趣的练习。我在代码中添加了一些注释,但大部分都没有改动。 要更新其他窗口,必须为另一个窗口创建一个方法,该方法将执行所需的操作。
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()


有趣的练习。我在代码中添加了一些注释,但大部分都没有改动。 要更新其他窗口,必须为另一个窗口创建一个方法,该方法将执行所需的操作。
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()


对于类名,请使用CapitalCase好的先生,谢谢您的提醒,因此您可以立即打包小部件,然后向其添加内容对于类名,请使用CapitalCase好的先生,谢谢您的提醒,因此您可以立即打包小部件,然后向其添加内容