【问题标题】:bad window path name !toplevel错误的窗口路径名 !toplevel
【发布时间】:2020-02-03 22:42:33
【问题描述】:

我正在尝试制作一个程序,您可以在其中登录并转到主菜单,但是我在主菜单上遇到了问题。我认为这可能与删除根窗口有关,但我没有尝试过。当所有代码都在一个文件中时,此代码有效,但我希望它们位于单独的文件中。

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"

如果有人可以帮助我,那就太好了。 如果这个解释不清楚,我很抱歉。我会尽量与任何有疑问的人一起解决。

【问题讨论】:

    标签: python tkinter import


    【解决方案1】:

    我认为您在 Back 中尝试做的是显示撤回的根(如果它被最小化)。 你应该在 root 上调用 state,而不是 main,因为 main 已经被销毁了。

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

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

    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)
            ...
    

    【讨论】:

    • 非常感谢您的帮助。我的代码现在可以工作了。您能解释一下部分方法的一般作用吗?
    • 如果此答案解决了您的问题,您可以接受。 python docs functools.partial。 Partial 接受一个函数和任意数量的参数和关键字参数,并返回一个行为类似于函数的对象。当调用部分函数时,原始函数使用部分参数调用,并由调用站点的参数扩展。
    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 2020-06-10
    • 2020-11-14
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多