Tkinter无意递归,带菜单栏命令...引起的原因?

2024-05-19 06:46:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用tkinter制作一个Python GUI,我需要一个菜单项来打开主窗口的另一个副本。我试着做下面的代码,当我运行这个程序时,它冻结了一段时间,然后打开了大量的窗口。最后一条消息打印在下面。在

我有两个问题。在

  1. 如何完成使“New”按钮打开TheThing类的新窗口和实例的任务?(在IDLE中,File > New File具有我正在寻找的行为。)
  2. 为什么会发生这种错误?在

    RecursionError: maximum recursion depth exceeded while calling a Python object
    

我的代码:

^{pr2}$

我已经找到答案的地方:

  • This question似乎有一个非常相似的问题。我也许可以研究这个问题并找到解决办法,但我还是不明白这个问题。

  • This question是关于递归、python和tkinter的,但似乎更多地是关于after的事情。


Tags: 实例代码程序消息newtkinter副本gui
1条回答
网友
1楼 · 发布于 2024-05-19 06:46:53

问题在于:

    file.add_command(label = 'New', command = doathing())

在这里,执行doathing回调,然后尝试将其结果(即None)绑定到命令。在这种特定情况下,这也会导致无限递归,因为回调将创建一个新的框架实例,该实例将再次执行回调,从而创建另一个框架,依此类推。与其调用函数,还必须将函数本身绑定到命令。在

^{pr2}$

如果需要将参数传递给该函数(这里不是这种情况),可以使用lambda

    file.add_command(label = 'New', command = lambda: doathing(params))

另外,不需要创建另一个Tk实例,您应该在回调中创建一个^{}实例,即

def doathing():
    thing1 = tk.Toplevel()
    thing2 = TheThing(thing1)

相关问题 更多 >

    热门问题