Я использую tkinter для создания программы отчетов. Прямо сейчас программирование работает по назначению, но с небольшой проблемой, на которую я не нашел решения.Проблемы наследования классов. Tkinter. Python 3.x
Я пытаюсь вызвать функцию, которая создаст новое окно с виджетами и возможность записи в файл. Вызов функции выполняется внутри класса, который наследуется от родительского класса. Моя проблема заключается в том, что меню, которое подкласс также наследует к окну, вызываемому функцией для создания. Проблема возникает при обоих вызовах функций внутри классов PageOne и PageTwo.
Если вам нужно, чтобы я уточнил что-то или отредактировал мой вопрос, пожалуйста, дайте мне знать.
Ниже куски кода:
class Window(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.iconbitmap(self, default="investigator.ico")
tk.Tk.wm_title(self, "Digital Investigator Report Program")
tk.Tk.wm_minsize(self, 375, 200)
storage = tk.Frame(self)
storage.pack(side="top", fill="both", expand=True)
storage.grid_rowconfigure(0, weight=1)
storage.grid_columnconfigure(0, weight=1)
self.frames = {}
for Frame_holder in (StartPage, PageOne, PageTwo):
frame = Frame_holder(storage, self)
self.frames[Frame_holder] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.frame_show(StartPage)
def frame_show(self, cont):
frame = self.frames[cont]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.test1 = tk.Label(self, text="Select Your Report Form", font=LARGE_FONT)
self.test1.pack(pady=10, padx=10)
self.button1 = Button(self, text="Evidence Item Form",
command=lambda: controller.frame_show(PageOne))
self.button1.pack()
self.button2 = Button(self, text="Investigation Record",
command=lambda: controller.frame_show(PageTwo)).pack()
self.button3 = Button(self, text="Quit Program",
command=program_quit).pack()
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.test1 = tk.Label(self, text="Create Record or Return", font=LARGE_FONT)
self.test1.pack(pady=10, padx=10)
self.create_button = Button(self, text="Create Evidence Item Form",
command=evidence_item).pack()
self.return_button = Button(self, text="Back to Start Page",
command=lambda: controller.frame_show(StartPage)).pack()
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.test1 = tk.Label(self, text="Create Record or Return", font=LARGE_FONT)
self.test1.pack(pady=10, padx=10)
self.create_button = Button(self, text="Create Investigation Record",
command=investigation_record).pack()
self.return_button = Button(self, text="Back to Start Page",
command=lambda: controller.frame_show(StartPage)).pack()
if __name__ == "__main__":
app = Window()
app.mainloop()
Ниже функция, которая вызывается внутри класса PageOne:
def evidence_item():
def print_report():
try:
file_name = name_box.get() + ".txt"
file_intro = "Digital Forensics Investigation Documentation" \
"\n_____________________________________________\n\n"
with open(file_name, "w") as file:
file.write(file_intro + "SECTION 1: Evidence Item Record \n"
"\nLab Reference Number: " + text_box3.get() +
"\nCase Reference Number: " + text_box4.get() +
"\nItem Reference Number: " + text_box5.get() +
"\nDevice Description: " + text_box1.get() +
"\n\nAdditional Information: \n\t" + text_box6.get("1.0", tk.END) +
"_____________________________________________"
"\nSECTION 2: Investigator Details "
"\nDevice Accepted By: " + text_box2.get() +
"\nDate And Time Received: " + text_box7.get() +
"\n\n____________________________________________"
"\nSignature: "
"\n\n____________________________________________\n\n")
finally:
box.showinfo("Report Created", "Your Forensics Report Has Been Made")
def main_menu():
box.showinfo("Returning To Main Program", "Program Is Returning")
report_window.destroy()
report_window = Window()
name_label = Label(report_window, text="Enter Report Title: ", font=("Verdana", 10))
name_box = Entry(report_window)
reference_label = Label(report_window, text="Lab Reference Number: ", font=("Verdana", 10))
text_box3 = Entry(report_window)
case_label = Label(report_window, text="Case Reference Number: ", font=("Verdana", 10))
text_box4 = Entry(report_window)
item_label = Label(report_window, text="Item Reference Number: ", font=("Verdana", 10))
text_box5 = Entry(report_window)
device_label = Label(report_window, text="Device Description: ", font=("Verdana", 10))
text_box1 = Entry(report_window)
info_label = Label(report_window, text="Additional Information: ", font=("Verdana", 10))
text_box6 = ScrolledText(report_window, width=40, height=10, wrap=tk.WORD)
accepted_by = Label(report_window, text="Device Accepted By: ", font=("Verdana", 10))
text_box2 = Entry(report_window)
date_time = Label(report_window, text="Date And Time Received: ", font=("Verdana", 10))
text_box7 = Entry(report_window)
print_button = Button(report_window, text="Save Report", command=print_report)
close = Button(report_window, text="Return To Main Program", command=main_menu)
name_label.pack()
name_box.pack()
reference_label.pack()
text_box3.pack()
case_label.pack()
text_box4.pack()
item_label.pack()
text_box5.pack()
device_label.pack()
text_box1.pack()
info_label.pack()
text_box6.pack()
accepted_by.pack()
text_box2.pack()
date_time.pack()
text_box7.pack()
print_button.pack()
close.pack()
report_window.grid()
report_window.mainloop()
Я уже заметил отступ. Теперь он должен быть исправлен! – AlexanderJ
Вы написали _ «Я пытаюсь вызвать функцию, которая создаст новое окно с виджетами и возможность записи в файл». _ - Какая функция? Я не вижу никакого кода, создающего новое окно. Можете быть более конкретными? –
Извините. Теперь я включил функцию, вызываемую в классе PageOne. Окно и функциональность, созданная для функции, появляется и работает, но она также получит меню из места StartPage в верхней части окна, созданного функцией. – AlexanderJ