Есть listbox и он наследует последний фрейм

Есть такой код:

from tkinter import *
import tkinter.ttk as ttk
import json
import os
import webbrowser
from tkinter import messagebox as mb

Programs_name = "Some"
version_of_programm = 0.1
title = Programs_name + " Version:" + str(version_of_programm)

if __name__ == "__main__":
    root = Tk()
    root = root
    root.title(title)
    root.geometry('600x650')
    root.resizable(False, False)



    class Player():
        def __init__(self, name,invent, url, invent2, url1):
            self.name = name
            self.invent = invent
            self.url = url
            self.invent2 = invent2
            self.url1 = url1

    menu = Menu(root)
    root.config(menu=menu)

    pers_menu = Menu(menu, tearoff=0)

    knigi_menu = Menu(menu, tearoff=0)

    tools_menu = Menu(menu, tearoff=0)

    tools_submenu1 = Menu(tools_menu, tearoff=0)

    tools_submenu11 = Menu(tools_submenu1, tearoff=0)
    tools_submenu111 = Menu(tools_submenu11, tearoff=0)
    tools_submenu1111 = Menu(tools_submenu11, tearoff=0)
    tools_submenu11111 = Menu(tools_submenu11, tearoff=0)
    tools_submenu111111 = Menu(tools_submenu11, tearoff=0)

    tools_submenu2 = Menu(tools_menu, tearoff=0)
    tools_submenu22 = Menu(tools_submenu11, tearoff=0)
    tools_submenu222 = Menu(tools_submenu11, tearoff=0)
    tools_submenu2222 = Menu(tools_submenu11, tearoff=0)
    tools_submenu22222 = Menu(tools_submenu11, tearoff=0)

    tools_submenu3 = Menu(tools_menu, tearoff=0)
    tools_submenu33 = Menu(tools_submenu11, tearoff=0)
    tools_submenu333 = Menu(tools_submenu11, tearoff=0)
    tools_submenu3333 = Menu(tools_submenu11, tearoff=0)
    tools_submenu33333 = Menu(tools_submenu11, tearoff=0)
    tools_submenu333333 = Menu(tools_submenu11, tearoff=0)
    tools_submenu3333333 = Menu(tools_submenu11, tearoff=0)

    tools_submenu4 = Menu(tools_menu, tearoff=0)
    tools_submenu44 = Menu(tools_submenu11, tearoff=0)

    submenu = Menu(pers_menu, tearoff=0)

    vkladki = ttk.Notebook(root)

    player_list = []
    players_dict = {}
    player_obj = []

    def open_my_vk():
        webbrowser.get(using=None).open_new_tab('https://vk.com/club194526921')


    def open_kniga_igroka():
        import os

        file_path = r'kniga_igroka_5.pdf'
        os.system("start " + file_path)


    def open_kniga_mastera():
        file_path = r'kniga_mastera_5.pdf'
        os.system("start " + file_path)

    dict_player_tabs = {}
    players_names = []
    delpers1 = 0

    def create_pers():
        create_pers_children = Toplevel(root)
        create_pers_children.title("Создание персонажа")
        create_pers_children.minsize(width=400, height=200)

        def complite_pers():
            name = pers_name.get()
            player = Player(name, [], [], [], [])


            newtab = ttk.Frame(vkladki)
            vkladki.add(newtab, text=str(player.name))
            vkladki.pack(expand=1, fill='both')

            player.labl_name = Label(newtab, text="Имя:" + player.name)
            player.labl_name.place(x=0, y=2)

            if player not in player_list:
                player_list.append(player)

            number = len(player_list)

            players_dict[number] = {"player_name":player.name, "player":player}

            player_dict = {"name": player.name}
            frame_dict = {"frame": newtab}
            players_names.append(player.name)
            player_obj.append(player)

            dict_player_tabs[number] = dict(list(player_dict.items()) + list(frame_dict.items()))

            player.url = []

            player.invent_listbox = Listbox(newtab, width=30, height=20)
            player.invent_listbox.place(x=0, y=260)
            player.invent_listbox.bind("<Double-Button-1>", lambda event: webbrowser.get(using=None).open_new(player.url[player.invent_listbox.curselection()[0]]))
            player.invent_listbox.bind("<Return>", lambda event: print(player.invent_listbox))

            player.invent2_listbox = Listbox(newtab, width=30, height=20)
            player.invent2_listbox.place(x=180, y=260)
            player.invent2_listbox.bind("<Double-Button-1>", lambda event: webbrowser.get(using=None).open_new(player.url1[player.invent2_listbox.curselection()[0]]))
            player.invent2_listbox.bind("<Return>", lambda event: print(player.invent2_listbox))


            player.buton_to_invent = Button(newtab, text="Добавить", command=lambda: add_in_invent())
            player.buton_to_invent.place(x=0, y=585)
            player.buton_to_invent1 = Button(newtab, text="Удалить", command=lambda: delete_invent())
            player.buton_to_invent1.place(x=70, y=585)

            player.buton_to_invent2 = Button(newtab, text="Добавить", command=lambda: add_in_invent1())
            player.buton_to_invent2.place(x=200, y=585)
            player.buton_to_invent3 = Button(newtab, text="Удалить", command=lambda: delete_invent1())
            player.buton_to_invent3.place(x=270, y=585)

            player.url1 = []

            def delete_invent1():
                index = player.invent2_listbox.curselection()
                print(index)
                player.url1.pop(index[0])
                player.invent2_listbox.delete(index)

            def add_in_invent1():
                children_add = Toplevel(newtab)
                children_add.title("Добавить")
                children_add.minsize(width=400, height=400)


                def complite_add_to_invent():
                    player.url1.append(player.entry_invent_add_url.get())
                    player.invent2_listbox.insert(END, player.entry_invent_add_name.get())

                lable_invet_add_name = Label(children_add, text="Имя предмета:")
                lable_invet_add_name.place(x=0, y=10)
                lable_invet_add_url = Label(children_add, text="URL:")
                lable_invet_add_url.place(x=0, y=40)

                player.entry_invent_add_name = Entry(children_add, )
                player.entry_invent_add_name.place(x=90, y=10)
                player.entry_invent_add_url = Entry(children_add, )
                player.entry_invent_add_url.place(x=90, y=40)

                player.button_to_complite_add_to_invent = Button(children_add, text="Подтвердить", command=lambda: complite_add_to_invent())
                player.button_to_complite_add_to_invent.place(x=0, y=80)
                children_add.mainloop()



            player.url = []
            def delete_invent():
                index = player.invent_listbox.curselection()
                print(index)
                player.url.pop(index[0])
                player.invent_listbox.delete(index)

            def add_in_invent():
                children_add = Toplevel(newtab)
                children_add.title("Добавить")
                children_add.minsize(width=400, height=400)

                def complite_add_to_invent():
                    player.url.append(player.entry_invent_add_url.get())
                    player.invent_listbox.insert(END, player.entry_invent_add_name.get())


                lable_invet_add_name = Label(children_add, text="Имя предмета:")
                lable_invet_add_name.place(x=0, y=10)
                lable_invet_add_url = Label(children_add, text="URL:")
                lable_invet_add_url.place(x=0, y=40)

                player.entry_invent_add_name = Entry(children_add, )
                player.entry_invent_add_name.place(x=90, y=10)
                player.entry_invent_add_url = Entry(children_add, )
                player.entry_invent_add_url.place(x=90, y=40)

                button_to_complite_add_to_invent = Button(children_add, text="Подтвердить", command=lambda : complite_add_to_invent())
                button_to_complite_add_to_invent.place(x=0, y=80)
                children_add.mainloop()

            def deletepers(event):
                answer = mb.askyesno(title="Вопрос", message="Вы точно хотите закрыть "+str(player.name)+"?")
                if answer == True:
                    if players_dict[number]["player"] in player_list:
                        newtab.destroy()
                        dict_player_tabs.pop(number)
                        players_dict.pop(number)
                        player_obj.remove(player)



            newtab.bind("<Button-3>", deletepers)

            create_pers_children.destroy()

        pers_name = Entry(create_pers_children, width=15)
        pers_name.place(x=40, y=0)

        labl_name = Label(create_pers_children, text="Имя:")
        labl_name.place(x=5, y=0)

        button = Button(create_pers_children, text="Создать персонажа", command=complite_pers)
        button.place(x=10, y=20)


        create_pers_children.mainloop()

    def load_pers():
        for root, dirs, files in os.walk("saves\\"):
            for filename in files:
                with open("saves\\" + str(filename), 'r', encoding="utf-8") as fh:
                    data = json.load(fh)
                    player = Player(data["name"], data["invent"], data["url"], data["invent2"], data["url1"])
                    if player not in player_list:
                        player_list.append(player)

                    newtab = ttk.Frame(vkladki)
                    print(newtab)
                    vkladki.add(newtab, text=str(player.name))
                    vkladki.pack(expand=1, fill='both')

                    number = len(player_list)

                    player_dict = {"name": player.name}
                    frame_dict = {"frame": newtab}
                    players_names.append(player.name)

                    dict_player_tabs[number] = dict(list(player_dict.items()) + list(frame_dict.items()))

                    player.labl_name = Label(newtab, text="Имя:" + player.name)
                    player.labl_name.place(x=0, y=2)


                    print(player.name)
                    print(player)

                    player.invent = []
                    player.invent2 = []
                    player.url = data["url"]
                    player.url1 = data["url1"]

                    player.invent_listbox = Listbox(newtab, width=30, height=20)
                    player.invent_listbox.place(x=0, y=260)
                    player.invent_listbox.bind("<Double-Button-1>", lambda event: print(player.invent_listbox.get(0)))
                    player.invent_listbox.bind("<Return>", lambda event: webbrowser.get(using=None).open_new(player.url[player.invent_listbox.curselection()[0]]))

                    player.invent2_listbox = Listbox(newtab, width=30, height=20)
                    player.invent2_listbox.place(x=180, y=260)
                    player.invent2_listbox.bind("<Double-Button-1>", lambda event: print(player.invent2_listbox.curselection()))
                    player.invent2_listbox.bind("<Return>", lambda event: print(player.invent2_listbox))
                    print(player.invent2_listbox)

                    for i in data["invent"]:
                        print("this is " + str(i))
                        player.invent_listbox.insert(END, i)
                        player.invent.append(i)
                    for ii in data["invent2"]:
                        print("this is " + str(i))
                        player.invent2_listbox.insert(END, ii)
                        player.invent2.append(ii)

                    player.buton_to_invent = Button(newtab, text="Добавить", command=lambda: add_in_invent())
                    player.buton_to_invent.place(x=0, y=585)
                    player.buton_to_invent1 = Button(newtab, text="Удалить", command=lambda: delete_invent())
                    player.buton_to_invent1.place(x=70, y=585)


                    player.buton_to_invent2 = Button(newtab, text="Добавить", command=lambda: add_in_invent1())
                    player.buton_to_invent2.place(x=200, y=585)
                    player.buton_to_invent3 = Button(newtab, text="Удалить", command=lambda: delete_invent1())
                    player.buton_to_invent3.place(x=270, y=585)

                    def delete_invent():
                        index = player.invent_listbox.curselection()
                        print(index)
                        player.url.pop(index[0])
                        player.invent_listbox.delete(index)

                    def add_in_invent():
                        player.children_add = Toplevel(newtab)
                        player.children_add.title("Добавить")
                        player.children_add.minsize(width=400, height=400)

                        def complite_add_to_invent1():
                            player.url.append(player.entry_invent_add_url.get())
                            player.invent_listbox.insert(END, player.entry_invent_add_name.get())

                        lable_invet_add_name = Label(player.children_add, text="Имя предмета:")
                        lable_invet_add_name.place(x=0, y=10)
                        lable_invet_add_url = Label(player.children_add, text="URL:")
                        lable_invet_add_url.place(x=0, y=40)

                        player.entry_invent_add_name = Entry(player.children_add, )
                        player.entry_invent_add_name.place(x=90, y=10)
                        player.entry_invent_add_url = Entry(player.children_add, )
                        player.entry_invent_add_url.place(x=90, y=40)

                        button_to_complite_add_to_invent = Button(player.children_add, text="Подтвердить",
                                                                  command=lambda: complite_add_to_invent1())
                        button_to_complite_add_to_invent.place(x=0, y=80)

                        player.children_add.mainloop()

                    def delete_invent1():
                        index = player.invent2_listbox.curselection()
                        player.url1.pop(index[0])
                        player.invent2_listbox.delete(index)

                    def add_in_invent1():
                        children_add = Toplevel(player.newtab)
                        children_add.title("Добавить")
                        children_add.minsize(width=400, height=400)

                        def complite_add_to_invent2():
                            player.url1.append(player.entry_invent_add_url1.get())
                            player.invent2_listbox.insert(END, player.entry_invent2_add_name.get())

                        lable_invet_add_name = Label(children_add, text="Имя предмета:")
                        lable_invet_add_name.place(x=0, y=10)
                        lable_invet_add_url = Label(children_add, text="URL:")
                        lable_invet_add_url.place(x=0, y=40)

                        player.entry_invent_add_name = Entry(children_add, )
                        player.entry_invent_add_name.place(x=90, y=10)
                        player.entry_invent_add_url = Entry(children_add, )
                        player.entry_invent_add_url.place(x=90, y=40)

                        player.button_to_complite_add_to_invent = Button(children_add, text="Подтвердить", command=lambda: complite_add_to_invent2())
                        player.button_to_complite_add_to_invent.place(x=0, y=80)

                        children_add.mainloop()
        print("load")


    def callback(url):
        print(url)
        webbrowser.open_new(url)

    def save_pers():
        time_number = 0
        for i in player_list:
            print(i)
            print(players_dict)
            if str(i) in str(player_obj):
                name = i.name
                print(i.name)

                invent = i.invent_listbox.get(0, END)
                url = i.url

                invent2 = i.invent2_listbox.get(0, END)
                url1 = i.url1

                print("saved")
                data = {"name": name, "invent":invent, "url":url, "invent2":invent2, "url1":url1}
                with open("saves\\" + str(i.name) + ".json", "w", encoding="utf-8") as file:
                    json.dump(data, file)
                print("saved success")
            if str(i) not in str(player_obj):
                print("Pass")
                continue





    pers_menu.add_command(label='Добавить', command=create_pers)
    pers_menu.add_command(label='Загрузить', command=load_pers)
    pers_menu.add_command(label='Сохранить всех', command=save_pers)

    menu.add_cascade(label="Персонаж", menu=pers_menu)



root.mainloop()

А точнее это вырезка из одного довольно большого когда, вообщем, проблема заключается в listbox'е, а точнее в том, что после загрузки, все лист боксы, которые были в других персах, наследуют последнего. По другому скажу: При загрузке

.!notebook.!frame2.!listbox2#это листбокс с первого перса
.!notebook.!frame2.!listbox2#это листбокс со второго перса

Если создавать:

.!notebook.!frame.!listbox2
.!notebook.!frame2.!listbox2

Буду благодарен за любую помощь. Мозги уже вытекают от этой ерунды.


Ответы (1 шт):

Автор решения: DeMeNToR

Надо было просто засунуть код в функцию и уже функцию вызывать через for

→ Ссылка