Почему я не могу добавить новый холст, не испортив свой проект в tkinter?

#python #tkinter #widget

#питон #tkinter #виджет

Вопрос:

Итак, я работаю над этим проектом в tKinter и добавляю серию рамок и холста в виджет своего ноутбука. Я добавил их все одним и тем же способом, и программа работает нормально, но когда я добавляю последний, все путается. Вот как выглядит программа без последнего кадра: ДА

И вот как это выглядит с последним кадром: НЕТ

Это мой код:

 import os import tkinter as tk from tkinter import messagebox from tkinter import filedialog from tkinter import ttk from PIL import ImageTk, Image  in_editor = False  root1 = tk.Tk() root1.resizable(0, 0) root1.title("Project Dragonfly")  plus_image = Image.open("Media/plus.png") x_image = Image.open("Media/x.png") expand_image = Image.open("Media/Expand.png") retract_image = Image.open("Media/Retract.png")  x_image = x_image.resize((30, 30), Image.ANTIALIAS) plus_image = plus_image.resize((30, 30), Image.ANTIALIAS) expand_image = expand_image.resize((30, 30), Image.ANTIALIAS) retract_image = retract_image.resize((30, 30), Image.ANTIALIAS)  x_image = ImageTk.PhotoImage(x_image) plus_image = ImageTk.PhotoImage(plus_image) expand_image = ImageTk.PhotoImage(expand_image) retract_image = ImageTk.PhotoImage(retract_image)  room_frame_number = 0 rooms_frame_list = [] room_entries_list = [] room_names_list = []  item_frame_number = 0 items_frame_list = []  key_frame_number = 0 keys_frame_list = []  door_frame_number = 0 doors_frame_list = []  sequence_frame_number = 0 sequences_frame_list = []   def set_location(event):  global loc_entry  root1.folder_selected = filedialog.askdirectory(initialdir=r"C:UsersUsuarioDesktop")  loc_entry.configure(state="normal")  loc_entry.delete(0, "end")  loc_entry.insert(-1, root1.folder_selected)  loc_entry.configure(state="disabled")   def duplicated_file():  messagebox.showerror("Error", "Ya existe un proyecto con este título.")   def enter_editor():  def create_scrollbar(frame, canvas, second_frame):  def adjust_scrollregion(event):  canvas.configure(scrollregion=canvas.bbox("all"))   my_scrollbar = tk.Scrollbar(frame, orient="vertical", command=canvas.yview)  my_scrollbar.pack(side="right", fill="y")  canvas.configure(yscrollcommand=my_scrollbar.set)  canvas.bind("lt;Configuregt;", lambda e: canvas.configure(scrollregion=canvas.bbox("all")))   second_frame.bind("lt;Configuregt;", adjust_scrollregion)   global room_frame_number   root1.resizable(0, 0)  root1.geometry("1100x800")   title = title_entry.get()  author = author_entry.get()  path = loc_entry.get()   main_Frame.destroy()   editor_frame = tk.Frame(root1)  editor_frame.pack()   try:  os.mkdir(path   "/{}".format(title))  path = path   "/{}/game_data.py".format(title)  file = open(path, "w")  file.write("Author = "   author   "n")  file.write("Title = "   title   "nn")  except FileExistsError:  duplicated_file()   root1.title("Project Dragonfly - "   title   ", por "   author)   my_notebook = ttk.Notebook(root1)  my_notebook.pack()   width = 1100   info_frame = ttk.Frame(my_notebook, width=width, height=800)  rooms_frame = ttk.Frame(my_notebook, width=width, height=800)  items_frame = ttk.Frame(my_notebook, width=width, height=800)  keys_frame = ttk.Frame(my_notebook, width=width, height=800)  doors_frame = ttk.Frame(my_notebook, width=width, height=800)  sequences_frame = ttk.Frame(my_notebook, width=width, height=800)   info_frame.grid_propagate(0)  rooms_frame.grid_propagate(0)  items_frame.grid_propagate(0)  keys_frame.grid_propagate(0)  doors_frame.grid_propagate(0)  sequences_frame.grid_propagate(0)   info_frame.pack(fill="both", expand=1)  rooms_frame.pack(fill="both", expand=1)  items_frame.pack(fill="both", expand=1)  keys_frame.pack(fill="both", expand=1)  doors_frame.pack(fill="both", expand=1)  sequences_frame.pack(fill="both", expand=1)   my_notebook.add(info_frame, text="Información")  my_notebook.add(rooms_frame, text="Habitaciones")  my_notebook.add(items_frame, text="Objetos")  my_notebook.add(keys_frame, text="Llaves")  my_notebook.add(doors_frame, text="Puertas")  my_notebook.add(sequences_frame, text="Secuencias")   info_canvas = tk.Canvas(info_frame)  info_canvas.pack(side="left", fill="both", expand=1)   rooms_canvas = tk.Canvas(rooms_frame)  rooms_canvas.pack(side="left", fill="both", expand=1)   items_canvas = tk.Canvas(items_frame)  items_canvas.pack(side="left", fill="both", expand=1)   keys_canvas = tk.Canvas(keys_frame)  keys_canvas.pack(side="left", fill="both", expand=1)   doors_canvas = tk.Canvas(doors_frame)  doors_canvas.pack(side="left", fill="both", expand=1)   #sequences_canvas = tk.Canvas(sequences_frame)  #sequences_canvas.pack(side="left", fill="both", expand=1)   info_second_frame = tk.Frame(info_canvas)  info_canvas.create_window((0, 0), window=info_second_frame, width=width, anchor="nw")   rooms_second_frame = tk.Frame(rooms_canvas, width=width)  rooms_canvas.create_window((0, 0), window=rooms_second_frame, width=width, anchor="nw")   items_second_frame = tk.Frame(items_canvas, width=width)  items_canvas.create_window((0, 0), window=items_second_frame, width=width, anchor="nw")   keys_second_frame = tk.Frame(keys_canvas, width=width)  keys_canvas.create_window((0, 0), window=keys_second_frame, width=width, anchor="nw")   doors_second_frame = tk.Frame(doors_canvas, width=width)  doors_canvas.create_window((0, 0), window=doors_second_frame, width=width, anchor="nw")   #sequences_second_frame = tk.Frame(sequences_canvas, width = width)  #sequences_canvas.create_window((0,0), window=sequences_second_frame, width=width, anchor="nw")   create_scrollbar(info_frame, info_canvas, info_second_frame)  create_scrollbar(rooms_frame, rooms_canvas, rooms_second_frame)  create_scrollbar(items_frame, items_canvas, items_second_frame)  create_scrollbar(keys_frame, keys_canvas, keys_second_frame)  create_scrollbar(doors_frame, doors_canvas, doors_second_frame)  #create_scrollbar(sequences_frame, sequences_canvas, sequences_second_frame)   main_Frame = tk.LabelFrame(root1) main_Frame.pack()  create_project_label = tk.Label(main_Frame, text="CREAR NUEVO PROYECTO", font=("Trajan", 22), anchor="w", width=23,  height=1) title_label = tk.Label(main_Frame, text="TÍTULO: ", font=("Arial", 13), anchor="w", width=14, height=1, pady=5) loc_label = tk.Label(main_Frame, text="LOCALIZACIÓN: ", font=("Aharoni", 13), anchor="w", width=14, height=1, pady=5) author_label = tk.Label(main_Frame, text="AUTOR: ", font=("Aharoni", 13), anchor="w", width=14, height=1, pady=5)  button_frame = tk.Frame(main_Frame, pady=16) ok_button = tk.Button(button_frame, text="Aceptar", width=10, command=enter_editor) button_separator = tk.Label(button_frame, width=10) cancel_buton = tk.Button(button_frame, text="Cancelar", width=10, command=root1.destroy)  title_entry = tk.Entry(main_Frame, width=42)  loc_entry = tk.Entry(main_Frame, width=42, state="disabled")  author_entry = tk.Entry(main_Frame, width=42)  create_project_label.grid(column=0, row=1, columnspan=4)  title_label.grid(column=0, row=2) title_entry.grid(column=1, row=2)  loc_label.grid(column=0, row=3) loc_entry.grid(column=1, row=3)  author_label.grid(column=0, row=4) author_entry.grid(column=1, row=4)  button_frame.grid(column=0, row=5, columnspan=3, padx=20) ok_button.grid(column=0, row=0) button_separator.grid(column=1, row=0) cancel_buton.grid(column=2, row=0)  loc_entry.bind("lt;1gt;", set_location)  root1.mainloop()  

Что я делаю не так? Части, которые портят программу, — это комментарии (начинающиеся с #).

Комментарии:

1. Пожалуйста, попробуйте сократить этот код до меньшего примера. Было бы особенно полезно, если бы вы удалили изображения.

2. Интересно, почему ноутбук заполняет все пространство (первое изображение) без использования my_notebook.pack(fill='both', expand=1) . Я ожидаю, что второе изображение является правильным выводом вашего кода.

3. Существует так много дублированного кода, который можно было бы заменить циклом. Использование цикла значительно упростило бы отладку этого кода. Кроме того, вы вызываете grid_propagate(0) кадры, но затем используете pack их для размещения объектов в кадрах. Моя рекомендация состояла бы в том, чтобы использовать цикл и классы для создания вкладок, поскольку, насколько я могу судить, все они идентичны.