Python:使用deiconify时窗口路径名不正确

Python:使用deiconify时窗口路径名不正确,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在做的一个python程序遇到了这个问题,如果我显示一个顶级窗口,在本例中是我的帮助菜单,然后撤消它,然后再次尝试显示它,我会得到以下错误 Exception in Tkinter callback Traceback (most recent call last): File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__ return self.func(*args) File "C:\Users

我正在做的一个python程序遇到了这个问题,如果我显示一个顶级窗口,在本例中是我的帮助菜单,然后撤消它,然后再次尝试显示它,我会得到以下错误

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
    return self.func(*args)
  File "C:\Users\****\Documents\GitHub\ProjectName\ProjectName\GUI.py", line 60, in     displayHelp
    self.helpMenu.display();
  File "C:\Users\****\Documents\GitHub\ProjectName\ProjectName\HelpMenu.py", line 35, in display
    self.deiconify();
  File "C:\Python34\lib\tkinter\__init__.py", line 1646, in wm_deiconify
    return self.tk.call('wm', 'deiconify', self._w)
_tkinter.TclError: bad window path name ".60000336"
当我从HelpMenu.py中退出并使用deiconify从GUI.py文件中重新显示它时,第一次发生错误。 从那以后,我尝试了多种方法来解决这个问题,包括从HelpMenu.py中调用deiconify,以及在我撤销帮助菜单时更新存储在GUI中的帮助菜单副本。 我正在运行Python 3.4.2

我已经在网上做了大量的搜索,但没有找到解决问题的方法。我发现了其他关于这个错误的提及,但它们要么与我的情况无关,要么它们的解决方案不起作用

下面是HelpMenu.py的完整代码,后面是GUI.py的摘录,它保留了再现错误的功能,但删除了其他代码

#!/usr/bin/python
try:
    from Tkinter import *
except ImportError:
    from tkinter import *

class HelpMenu(Toplevel):
    def __init__(self, parent, observer):
        Toplevel.__init__(self);
        self.observer = observer;#Observer is the GUI, this is here just so I can update the GUI when I withdraw this window
        self.setup();
        self.withdraw();
        self.protocol('WM_DELETE_WINDOW', self.quit());#Changes the close button to just hide the window

    def setup(self):
       self.columnconfigure(0,weight=1);
       w = 400;#Sets up the window position on the screen
       h = 150;
       sw = self.winfo_screenwidth();
       sh = self.winfo_screenheight();
       x=(sw-w)/2;
       y =(sh-h)/2;
       self.update();
       self.geometry('%dx%d+%d+%d' % (w,h,x,y));
       self.resizable(width=0, height=0);
       self.grid();
       self.title("Help Menu");
    def quit(self):#Hides the window
       self.withdraw();
       self.observer.updateHelp(self);
    def display(self):#Re-displays the window
        self.deiconify();
这里的代码取自GUI.py,经过修改,只包含重现问题所需的代码

    #!/usr/bin/python
#Allows compatibility with any version of Python by checking for both versions of Tkinter
try:
    from Tkinter import *
except ImportError:
    from tkinter import *
#Imports the AutoCompleteEntry
from HelpMenu import HelpMenu

class UI(Tk):
    def initialize(self):
        #Handles setting up most of the GUI
        w = 500;#Window width
        h = 500;#Window height
        sw = self.winfo_screenwidth();#Gets screen width
        sh = self.winfo_screenheight();#Gets screen height
        x=(sw-w)/2;#Calculates the x position for the left side of the window that allows it to be placed in the center of the screen
        y =(sh-h)/2;#Calculates the y position for the top of the window that allows it to be placed in the center of the screen
        self.update();#Forces and update on the window
        self.geometry('%dx%d+%d+%d' % (w,h,x,y));#Sets the windows width, height and position
        self.minsize(int(w),int(h/2));#Sets the minimum size of the window
        self.configureMenu();
    def updateHelp(self, helpMenu):
        self.helpMenu=helpMenu;
    def displayHelp(self):
        self.helpMenu.display();
    def configureMenu(self):
        #Handles configuring and setting up the menus
        menu = Menu(self);#Setup the menu bar
        menu.add_command(label="Help",command=self.displayHelp);
        self.config(menu=menu);
    def __init__(self, parent):
     #Handles the initial call to create a GUI
        Tk.__init__(self,parent);#Parent constructor
        self.parent = parent;#Store the parent
        self.initialize();#Initilize the GUI
        self.helpMenu = HelpMenu(self, self);
        self.mainloop();#Start the main loop
if __name__ == "__main__":
    import sys
    main = UI(None);
最后一点注意,我对Python有点陌生,因此我的代码中可能还有其他错误,尽管我不介意指出这些错误,但我现在的主要关注点是修复这个路径名错误


编辑:差不多一个月了,我还没有找到解决问题的办法。任何帮助都会很好,但此时我可能不得不放弃我的项目。

我想可能是逗号导致了问题。试着这样写:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

try:
    from Tkinter import *
except ImportError:
    from tkinter import *

class HelpMenu(Toplevel):
    def __init__(self, parent, observer):
        Toplevel.__init__(self)
        self.observer = observer  # Observer is the GUI, this is here just so I can update the GUI when I withdraw this window
        self.setup()
        self.withdraw()
        self.protocol('WM_DELETE_WINDOW', self.quit())  # Changes the close button to just hide the window

    def setup(self):
        self.columnconfigure(0, weight=1)
        w = 400  # Sets up the window position on the screen
        h = 150
        sw = self.winfo_screenwidth()
        sh = self.winfo_screenheight()
        x = (sw - w) / 2
        y = (sh - h) / 2
        self.update()
        self.geometry('%dx%d+%d+%d' % (w, h, x, y))
        self.resizable(width=0, height=0)
        self.grid()
        self.title("Help Menu")
    def quit(self):  # Hides the window
        self.withdraw()
        self.observer.updateHelp(self)
    def display(self):  # Re-displays the window
        self.deiconify()


class UI(Tk):
    def initialize(self):
        # Handles setting up most of the GUI
        w = 500  # Window width
        h = 500  # Window height
        sw = self.winfo_screenwidth()  # Gets screen width
        sh = self.winfo_screenheight()  # Gets screen height
        x = (sw - w) / 2  # Calculates the x position for the left side of the window that allows it to be placed in the center of the screen
        y = (sh - h) / 2  # Calculates the y position for the top of the window that allows it to be placed in the center of the screen
        self.update()  # Forces and update on the window
        self.geometry('%dx%d+%d+%d' % (w, h, x, y))  # Sets the windows width, height and position
        self.minsize(int(w), int(h / 2))  # Sets the minimum size of the window
        self.configureMenu()
    def updateHelp(self, helpMenu):
        self.helpMenu = helpMenu
    def displayHelp(self):
        self.helpMenu.display()
    def configureMenu(self):
        # Handles configuring and setting up the menus
        menu = Menu(self)  # Setup the menu bar
        menu.add_command(label="Help", command=self.displayHelp)
        self.config(menu=menu)
    def __init__(self, parent):
        # Handles the initial call to create a GUI
        Tk.__init__(self, parent)  # Parent constructor
        self.parent = parent  # Store the parent
        self.initialize()  # Initilize the GUI
        self.helpMenu = HelpMenu(self, self)
        self.mainloop()  # Start the main loop
if __name__ == "__main__":
    main = UI(None)        

它在myside上运行得非常好。

因此,休息后,我又回去研究这个问题

原来问题是self.protocol('WM_DELETE_WINDOW',self.quit())实际上并没有调用self.quit(),而是完全破坏了窗口


快速更改self.protocol('WM_DELETE_WINDOW',self.quit)似乎已经解决了这个问题。

您在self.config(menu=menu)中做了什么?仅部分代码很难识别问题。所有代码都在那里,self.config(menu=menu)来自Tkinter,它将窗口的菜单栏设置为我设置的菜单栏。假设你指的是分号,那么不,这不起作用,它仍在做与以前完全相同的事情。@Alex是的,分号,我的错误。还是同样的错误吗?您使用的是什么版本的Python?