类继承问题。特金特。Python3.x

类继承问题。特金特。Python3.x,python,inheritance,tkinter,menu,Python,Inheritance,Tkinter,Menu,我正在使用tkinter创建一个报告程序。 目前,编程工作正常,但有一个小问题我还没有找到解决方案 我正在尝试调用一个函数,该函数将创建一个新窗口,其中包含小部件和写入文件的功能。函数调用是在从父类继承的类中进行的。我的问题是,子类拥有的菜单也被继承到调用函数创建的窗口。PageOne和PageTwo类内部的函数调用都出现问题 如果你需要我详细说明或编辑我的问题,请让我知道 下面是代码片段: class Window(tk.Tk): def __init__(self, *args, *

我正在使用tkinter创建一个报告程序。 目前,编程工作正常,但有一个小问题我还没有找到解决方案

我正在尝试调用一个函数,该函数将创建一个新窗口,其中包含小部件和写入文件的功能。函数调用是在从父类继承的类中进行的。我的问题是,子类拥有的菜单也被继承到调用函数创建的窗口。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()

主要问题是您的“新窗口”是主窗口的副本,因为这行代码:

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(),让它工作起来了!当函数生成新窗口时,如何关闭现有窗口?然后,我是否可以单击功能窗口中的“返回主菜单”按钮返回到原始菜单?非常感谢你的指点,布莱恩。你是个救生员!