Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 错误的窗口路径名!顶层_Python_Tkinter_Import - Fatal编程技术网

Python 错误的窗口路径名!顶层

Python 错误的窗口路径名!顶层,python,tkinter,import,Python,Tkinter,Import,我正在尝试制作一个程序,让你登录并进入主菜单,但主菜单有问题。我认为这可能与删除根窗口有关,但我尝试的方法都不起作用。当所有代码都在一个文件中时,这段代码可以工作,但我更希望它们在单独的文件中 from tkinter import * import sys import sqlite3 def main_menu(root): global Main if 'normal' == root.state(): Main = Toplevel()

我正在尝试制作一个程序,让你登录并进入主菜单,但主菜单有问题。我认为这可能与删除根窗口有关,但我尝试的方法都不起作用。当所有代码都在一个文件中时,这段代码可以工作,但我更希望它们在单独的文件中

from tkinter import *

import sys

import sqlite3


def main_menu(root):

    global Main

    if 'normal' == root.state():

        Main = Toplevel()

        Main.title("Main Menu")

        lbl_main = Label(Main, text = "Welcome to the main menu").pack()

        btn_back = Button(Main, text = "Back", command = Back(root)).pack(pady=20, fill = X)

        root.withdraw()


def Back(root):

    Main.destroy()

    if 'normal' != Main.state():

        root.deiconify()
这些函数都位于导入主文件的单独文件中。每次我尝试运行主文件时,登录部分工作正常,但在加载主菜单时,会出现此错误代码

Exception in Tkinter callback

Traceback (most recent call last):

  File "C:\Users\*\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__

    return self.func(*args)

  File "C:\Users\*\LOG IN 3.py", line 51, in login

    mainmenu.main_menu(root)

  File "C:\Users\*\mainmenu.py", line 13, in main_menu

    btn_back = Button(Main, text = "Back", command = 
Back(root)).pack(pady=20, fill = X)

  File "C:\Users\*\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 2369, in __init__

    Widget.__init__(self, master, 'button', cnf, kw)

  File "C:\Users\*\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 2299, in __init__

    (widgetName, self._w) + extra + self._options(cnf))

_tkinter.TclError: bad window path name ".!toplevel"
如果有人能帮助我,那就太好了。
如果这个解释不清楚,我道歉。我将尝试向任何有问题的人澄清。

我认为你试图在后面做的是显示撤回的根,如果它被最小化。 您应该在根上调用state,而不是main,因为main已经被销毁

def Back(root):
    Main.destroy()
    if 'normal' != root.state():
        root.deiconify()

ps:在主菜单中,您应该将命令设置为部分方法,而不是返回的结果。这将允许在单击按钮时调用Back,而不是在绘制主菜单时调用Back

from functools import partial
def main_menu(root):
    ...
    if 'normal' == root.state():
        ...
        btn_back = Button(Main, text = "Back", command = partial(Back, root)).pack(pady=20, fill = X)
        ...

非常感谢你的帮助。我的代码现在可以工作了。你能解释一下分部法的一般作用吗?如果这个答案解决了你的问题,你可以接受。Partial接受一个函数、任意数量的参数和关键字参数,并返回一个行为类似于函数的对象。调用分部函数时,使用分部参数调用原始函数,并通过调用站点上的参数进行扩展。