2016-12-22 3 views
1

Я использую 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() 
+0

Я уже заметил отступ. Теперь он должен быть исправлен! – AlexanderJ

+0

Вы написали _ «Я пытаюсь вызвать функцию, которая создаст новое окно с виджетами и возможность записи в файл». _ - Какая функция? Я не вижу никакого кода, создающего новое окно. Можете быть более конкретными? –

+0

Извините. Теперь я включил функцию, вызываемую в классе PageOne. Окно и функциональность, созданная для функции, появляется и работает, но она также получит меню из места StartPage в верхней части окна, созданного функцией. – AlexanderJ

ответ

0

Основная проблема заключается в том, что ваш «новое окно» является копия вашего главного окна из-за этой строки:

report_window = Window() 

Это даст вам дубликат вашего главного окна. Это плохо по нескольким причинам. Во-первых, вы получаете все те другие виджеты, которые, как вы утверждаете, вы не хотите. Большая проблема заключается в том, что этот класс Window наследует от Tk, и у вас всегда должен быть только один экземпляр Tk.

Решение состоит в том, чтобы сделать report_window экземпляром Toplevel. Это даст вам новое, пустое окно для размещения ваших виджетов.

report_window = Toplevel() 

Вам также необходимо будет удалить звонок до report_window.mainloop(). В дополнение к одному корневому (Tk) окну необходимо иметь ровно один цикл событий.

Если вы хотите дождаться отклонения окна, вы можете использовать метод wait_window, который будет блокироваться до тех пор, пока окно не будет уничтожено.

+0

Как я могу сделать экземпляр Toplevel для report_window? Извините за мой английский, это не мой родной язык. – AlexanderJ

+0

Я получил его сейчас, изменив report_window = Window() на report_window = tk.Toplevel()! Как можно закрыть существующее окно, когда функция генерирует новое? Смогу ли я затем нажать кнопку «вернуться в главное меню» в окне функций, чтобы вернуться к оригиналу? Большое спасибо за указатели, Брайан. Ты спасатель жизни! – AlexanderJ

Смежные вопросы