Есть 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