类继承问题。特金特。Python3.x
我正在使用tkinter创建一个报告程序。 目前,编程工作正常,但有一个小问题我还没有找到解决方案 我正在尝试调用一个函数,该函数将创建一个新窗口,其中包含小部件和写入文件的功能。函数调用是在从父类继承的类中进行的。我的问题是,子类拥有的菜单也被继承到调用函数创建的窗口。PageOne和PageTwo类内部的函数调用都出现问题 如果你需要我详细说明或编辑我的问题,请让我知道 下面是代码片段:类继承问题。特金特。Python3.x,python,inheritance,tkinter,menu,Python,Inheritance,Tkinter,Menu,我正在使用tkinter创建一个报告程序。 目前,编程工作正常,但有一个小问题我还没有找到解决方案 我正在尝试调用一个函数,该函数将创建一个新窗口,其中包含小部件和写入文件的功能。函数调用是在从父类继承的类中进行的。我的问题是,子类拥有的菜单也被继承到调用函数创建的窗口。PageOne和PageTwo类内部的函数调用都出现问题 如果你需要我详细说明或编辑我的问题,请让我知道 下面是代码片段: class Window(tk.Tk): def __init__(self, *args, *
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()
主要问题是您的“新窗口”是主窗口的副本,因为这行代码:
report_window = Window()
这将为您提供一个主窗口的副本。这不好有几个原因。首先,你得到了你声称不想要的所有其他小部件。更大的问题是这个窗口
类继承自Tk
,并且您应该始终只有一个Tk
的实例
解决方案是将report\u窗口
设置为Toplevel
的一个实例。这将为您提供一个新的空白窗口,用于放置小部件
report_window = Toplevel()
您还需要删除对report\u window.mainloop()
的调用。除了一个根(Tk
)窗口外,还需要有一个事件循环
如果要等待窗口被取消,可以使用
wait\u window
方法,该方法将一直阻止,直到窗口被销毁。主要问题是,由于这一行,您的“新窗口”是主窗口的副本:
report_window = Window()
这将为您提供一个主窗口的副本。这不好有几个原因。首先,你得到了你声称不想要的所有其他小部件。更大的问题是这个窗口
类继承自Tk
,并且您应该始终只有一个Tk
的实例
解决方案是将report\u窗口
设置为Toplevel
的一个实例。这将为您提供一个新的空白窗口,用于放置小部件
report_window = Toplevel()
您还需要删除对report\u window.mainloop()
的调用。除了一个根(Tk
)窗口外,还需要有一个事件循环
如果要等待窗口被取消,可以使用
wait\u window
方法,该方法将一直阻止,直到窗口被销毁。我已经发现缩进。现在应该修好了!你写过“我正在尝试调用一个函数,该函数将创建一个新窗口,其中包含小部件和写入文件的功能。”-这是什么函数?我没有看到任何创建新窗口的代码。你能说得更具体一点吗?很抱歉。我现在已经包括了在PageOne类中调用的函数。该功能所针对的窗口和功能确实出现并运行,但它也将从该功能窗口顶部的StartPage place中获取菜单。您是否希望此打开的窗口具有与原始窗口相同的所有页面,或者您想从一个完全空白的窗口开始?其目的是让函数打开新窗口,并将所有小部件设置为在函数中运行。现在,它确实做到了这一点,但也有令人讨厌的开始页面菜单按钮@BryanOakleyI已经发现了压痕。现在应该修好了!你写过“我正在尝试调用一个函数,该函数将创建一个新窗口,其中包含小部件和写入文件的功能。”-这是什么函数?我没有看到任何创建新窗口的代码。你能说得更具体一点吗?很抱歉。我现在已经包括了在PageOne类中调用的函数。该功能所针对的窗口和功能确实出现并运行,但它也将从该功能窗口顶部的StartPage place中获取菜单。您是否希望此打开的窗口具有与原始窗口相同的所有页面,或者您想从一个完全空白的窗口开始?其目的是让函数打开新窗口,并将所有小部件设置为在函数中运行。现在,它确实做到了这一点,但也有令人讨厌的开始页面菜单按钮@BRYANOAKLEY如何为报告窗口创建Toplevel实例?对不起,我的英语不是我的母语。我现在把report\u window=window()改为report\u window=tk.Toplevel(),让它工作起来了!当函数生成新窗口时,如何关闭现有窗口?然后,我是否可以单击功能窗口中的“返回主菜单”按钮返回到原始菜单?非常感谢你的指点,布莱恩。你是个救生员!如何为report\u窗口创建Toplevel实例?对不起,我的英语不是我的母语。我现在把report\u window=window()改为report\u window=tk.Toplevel(),让它工作起来了!当函数生成新窗口时,如何关闭现有窗口?然后,我是否可以单击功能窗口中的“返回主菜单”按钮返回到原始菜单?非常感谢你的指点,布莱恩。你是个救生员!