Проблема при загрузке окна Tkinter во второй раз - PullRequest
0 голосов
/ 25 февраля 2019

Итак, я пытаюсь создать главное меню для приложения Tkinter, которое я разработал, но вот проблема, когда я нажимаю один на кнопку, чтобы открыть другой файл, который является другим окном, все в порядке, но когда я закрываю это окнои попробуйте открыть его снова, нажав на ту же кнопку в главном меню, я получаю эту ошибку:

Exception in Tkinter callback
Traceback (most recent call last):
  File "c:\users\alireza\anaconda3\Lib\tkinter\__init__.py", line 1702, in __call__
    return self.func(*args)
  File "menu.py", line 32, in open_main
    root.destroy()
  File "c:\users\alireza\anaconda3\Lib\tkinter\__init__.py", line 2059, in destroy
    self.tk.call('destroy', self._w)
_tkinter.TclError: can't invoke "destroy" command: application has been destroyed

, и это мой файл главного меню (menu.py):

from tkinter import *
import tkinter.messagebox


class Application:
    def __init__(self, master, *args, **kwargs):


        self.mainframe = Frame(master, width = 300, height = 400, bg = 'slategray1')
        self.mainframe.pack()

        self.main_button = Button (self.mainframe, width = 25, height = 2,bg = "SteelBlue2" , text = "Customer Service", command = self.open_main)
        self.main_button.place(x= 55, y =50 )

        self.add_to_db_button = Button (self.mainframe, width = 25, height = 2,bg = "SteelBlue2" , text = "Add Item To Inventory", command = self.open_add_to_db)
        self.add_to_db_button.place(x= 55, y =100 )

        self.update_button = Button (self.mainframe, width = 25, height = 2,bg = "SteelBlue2" , text = "Update Inventory Items", command = self.open_update)
        self.update_button.place(x= 55, y =150 )

        self.about_button = Button (self.mainframe, width = 25, height = 2,bg = "sea green" , text = "Credits", command = self.about)
        self.about_button.place(x= 55, y =300 )

        self.close_button = Button (self.mainframe, width = 25, height = 2,bg = "navajo white" , text = "Quit", command = self.close_window)
        self.close_button.place(x= 55, y =350 )

    def close_window(self, *args, **kwargs):
        root.destroy()

    def open_main(self, *args, **kwargs):
        import main
        root.destroy()

    def open_add_to_db(self, *args, **kwargs):
        import add_to_db
        root.destroy()

    def open_update(self, *args, **kwargs):
        from update import AppUpdate
        root.destroy()

    def about(self, *args, **kwargs):
        tkinter.messagebox.showinfo("About Me", "Programmed and designed by Alireza Bagheri.")


root = Tk()
root.title("Main Menu")
root.resizable(False, False)
b = Application(root)
root.geometry("301x401+0+0")
root.mainloop()

Я точно не знаю, в чем проблема, поэтому многое бы указало мне правильное направление

1 Ответ

0 голосов
/ 25 февраля 2019

Как прокомментировал Idlehands, я не думаю, что вы должны полагаться на import main для построения окна, но вместо этого определите функцию (build_window() возможно?) В main, а затем вы можете вызвать ее, например, main.build_window().Это гарантирует, что вы знаете, какой код должен выполняться, и может помочь избежать ошибок.Я попытался запустить ваш код и не смог воспроизвести ошибку, но вместо этого обнаружил ошибки:

  1. ImportError: No module named 'main'
  2. ImportError: No module named 'update'
  3. ImportError: No module named 'add_to_db'

Так что это не минимальный, проверяемый и полный пример кода ошибки, с которой вы сталкиваетесь.Максимум, что мы можем сделать, чтобы помочь вам, это спекулировать решением.Я предполагаю, что если вы хотите «спрятать» окно, к которому вы позже вернетесь, вы должны .iconify(), чтобы свести его к панели задач.Если вы вызовете .destroy() для виджета Tkinter, этот виджет будет удален из памяти, и если вы захотите другой, вам придется определить его и .pack(), .place() или .grid() вернуть его на экран!Я предлагаю вам прочитать https://stackoverflow.com/help/mcve, чтобы получить представление о том, что такое минимальный, полный и проверяемый пример.Если вы исправите свой вопрос, сообществу будет намного легче помочь вам в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...