Anonymous
Почему я не могу закрыть фрейм A Tkinter и создать другой?
Сообщение
Anonymous » 05 мар 2026, 23:06
Я создал это приложение tkinter:
Код: Выделить всё
import os
import tkinter as tk
from tkinter import ttk
class SelectBodyScreen(ttk.Frame):
def __init__(self,root, lang, prod_text,test_text, on_next):
super().__init__(root)
self.lang = lang
self.prod_text_content = prod_text
self.test_text_content = test_text
self.root = root
self.build_ui()
self.on_next = on_next
def next_clicked(self):
selected_body = self.final_text.get("1.0", tk.END).strip()
self.on_next(selected_body)
def use_prod(self):
text = self.prod_text.get("1.0", tk.END)
self.final_text.delete("1.0", tk.END)
self.final_text.insert(tk.END, text)
def use_test(self):
text = self.test_text.get("1.0", tk.END)
self.final_text.delete("1.0", tk.END)
self.final_text.insert(tk.END, text)
def build_ui(self):
self.lang_label = ttk.Label(self.root, text="", font=("Arial", 14, "bold"))
self.lang_label.pack(pady=10)
frame = ttk.Frame(self.root)
frame.pack(fill="both", expand=True)
# PROD
ttk.Label(frame, text="Prod Body").grid(row=0, column=0)
self.prod_text = tk.Text(frame, height=15, width=50)
self.prod_text.grid(row=1, column=0, padx=5)
self.prod_text.insert("1.0",self.prod_text_content)
# TEST
ttk.Label(frame, text="Test Body").grid(row=0, column=1)
self.test_text = tk.Text(frame, height=15, width=50)
self.test_text.grid(row=1, column=1, padx=5)
self.test_text.insert("1.0",self.test_text_content)
# FINAL
ttk.Label(frame, text="Final Body").grid(row=2, column=0, columnspan=2)
self.final_text = tk.Text(frame, height=15, width=105)
self.final_text.grid(row=3, column=0, columnspan=2, pady=5)
button_frame = ttk.Frame(frame)
button_frame.grid(row=4, column=0, columnspan=2, pady=10)
ttk.Button(button_frame, text="Use Prod",
command=self.use_prod).pack(side="left", padx=5)
ttk.Button(button_frame, text="Use Test",
command=self.use_test).pack(side="left", padx=5)
ttk.Button(button_frame, text="Next",
command=self.next_clicked).pack(side="right", padx=5)
class TemplateWizard:
def __init__(self, root, folder, template_name_without_env, lang_order, aggregate):
self.root = root
self.folder = folder
self.template_name_without_env = template_name_without_env
self.lang_order = lang_order
self.aggregate = aggregate
self.lang_index = 0
self.current_screen = None
self.root.title("Template Wizard")
self.root.geometry("1100x800")
self.final = {
"body":{
"el":"",
"en":""
},
"buttons":[]
}
self.show_next_language()
def show_next_language(self):
if self.lang_index >= len(self.lang_order):
print("Wizard finished")
print("Final selections:", self.aggregate.get("final", {}))
self.root.destroy()
return
lang = self.lang_order[self.lang_index]
prod_text = self.aggregate[f"prod_{self.template_name_without_env}"][lang]['body']
test_text = self.aggregate[f"test_{self.template_name_without_env}"][lang]['body']
self.current_screen = SelectBodyScreen(
root=self.root,
lang=lang,
prod_text=prod_text,
test_text=test_text,
on_next=self.on_screen_next
)
self.current_screen.pack(fill="both", expand=True)
def on_screen_next(self, selected_body):
lang = self.lang_order[self.lang_index]
self.final['body'][lang]=selected_body
print(selected_body)
# # Store selected body
# if "final" not in self.aggregate:
# self.aggregate["final"] = {}
# self.aggregate["final"][lang] = selected_body
self.lang_index += 1
self.current_screen.destroy()
self.show_next_language()
Я реализую мастер, который позволяет мне выбрать значение из агрегата.
Моя проблема заключается в том, что когда я нажимаю кнопку «Далее», я получаю следующее:
И кадр не уничтожается правильно. Как я могу это исправить?
Подробнее здесь:
https://stackoverflow.com/questions/799 ... nother-one
1772741179
Anonymous
Я создал это приложение tkinter: [code]import os import tkinter as tk from tkinter import ttk class SelectBodyScreen(ttk.Frame): def __init__(self,root, lang, prod_text,test_text, on_next): super().__init__(root) self.lang = lang self.prod_text_content = prod_text self.test_text_content = test_text self.root = root self.build_ui() self.on_next = on_next def next_clicked(self): selected_body = self.final_text.get("1.0", tk.END).strip() self.on_next(selected_body) def use_prod(self): text = self.prod_text.get("1.0", tk.END) self.final_text.delete("1.0", tk.END) self.final_text.insert(tk.END, text) def use_test(self): text = self.test_text.get("1.0", tk.END) self.final_text.delete("1.0", tk.END) self.final_text.insert(tk.END, text) def build_ui(self): self.lang_label = ttk.Label(self.root, text="", font=("Arial", 14, "bold")) self.lang_label.pack(pady=10) frame = ttk.Frame(self.root) frame.pack(fill="both", expand=True) # PROD ttk.Label(frame, text="Prod Body").grid(row=0, column=0) self.prod_text = tk.Text(frame, height=15, width=50) self.prod_text.grid(row=1, column=0, padx=5) self.prod_text.insert("1.0",self.prod_text_content) # TEST ttk.Label(frame, text="Test Body").grid(row=0, column=1) self.test_text = tk.Text(frame, height=15, width=50) self.test_text.grid(row=1, column=1, padx=5) self.test_text.insert("1.0",self.test_text_content) # FINAL ttk.Label(frame, text="Final Body").grid(row=2, column=0, columnspan=2) self.final_text = tk.Text(frame, height=15, width=105) self.final_text.grid(row=3, column=0, columnspan=2, pady=5) button_frame = ttk.Frame(frame) button_frame.grid(row=4, column=0, columnspan=2, pady=10) ttk.Button(button_frame, text="Use Prod", command=self.use_prod).pack(side="left", padx=5) ttk.Button(button_frame, text="Use Test", command=self.use_test).pack(side="left", padx=5) ttk.Button(button_frame, text="Next", command=self.next_clicked).pack(side="right", padx=5) class TemplateWizard: def __init__(self, root, folder, template_name_without_env, lang_order, aggregate): self.root = root self.folder = folder self.template_name_without_env = template_name_without_env self.lang_order = lang_order self.aggregate = aggregate self.lang_index = 0 self.current_screen = None self.root.title("Template Wizard") self.root.geometry("1100x800") self.final = { "body":{ "el":"", "en":"" }, "buttons":[] } self.show_next_language() def show_next_language(self): if self.lang_index >= len(self.lang_order): print("Wizard finished") print("Final selections:", self.aggregate.get("final", {})) self.root.destroy() return lang = self.lang_order[self.lang_index] prod_text = self.aggregate[f"prod_{self.template_name_without_env}"][lang]['body'] test_text = self.aggregate[f"test_{self.template_name_without_env}"][lang]['body'] self.current_screen = SelectBodyScreen( root=self.root, lang=lang, prod_text=prod_text, test_text=test_text, on_next=self.on_screen_next ) self.current_screen.pack(fill="both", expand=True) def on_screen_next(self, selected_body): lang = self.lang_order[self.lang_index] self.final['body'][lang]=selected_body print(selected_body) # # Store selected body # if "final" not in self.aggregate: # self.aggregate["final"] = {} # self.aggregate["final"][lang] = selected_body self.lang_index += 1 self.current_screen.destroy() self.show_next_language() [/code] Я реализую мастер, который позволяет мне выбрать значение из агрегата. Моя проблема заключается в том, что когда я нажимаю кнопку «Далее», я получаю следующее: [img]https://i.sstatic.net/eALtlS5v.png[/img] И кадр не уничтожается правильно. Как я могу это исправить? Подробнее здесь: [url]https://stackoverflow.com/questions/79901060/why-i-am-unable-to-close-the-a-tkinter-frame-and-create-another-one[/url]