Непреднамеренная рекурсия Tkinter с командой меню … причина?

Я пытаюсь сделать Python GUI с помощью tkinter , и мне нужен элемент меню, который открывает другую копию главного окна. Я попытался сделать следующий код, и когда я запустил программу, он немного застыл, а затем открыл большое количество окон. Последнее сообщение об ошибке указано ниже.

У меня есть два вопроса.

  1. Как я могу выполнить задачу создания кнопки «Создать», чтобы открыть новое окно и экземпляр класса TheThing ? (В IDLE, File > New File есть поведение, которое я ищу.)
  2. Почему эта ошибка происходит?

     RecursionError: maximum recursion depth exceeded while calling a Python object 

Мой код:

 import tkinter as tk class TheThing: def __init__(self, root): root.option_add('*tearOff', False) menubar = tk.Menu(root) root.config(menu = menubar) file = tk.Menu(menubar) menubar.add_cascade(menu = file, label = "File") file.add_command(label = 'New', command = doathing()) def doathing(): thing1 = tk.Tk() thing2 = TheThing(thing1) def main(): win = tk.Tk() do = TheThing(win) win.mainloop() if __name__ == '__main__': main() 

Места, на которые я уже искал ответы:

  • Этот вопрос казался очень похожим на проблему. Я могу изучить это и найти решение, но я все равно не пойму проблему.

  • Этот вопрос касался рекурсии, python и tkinter, но, похоже, это было нечто большее.

One Solution collect form web for “Непреднамеренная рекурсия Tkinter с командой меню … причина?”

Проблема в этой строке:

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

Здесь вы выполняете doathing вызов doathing а затем пытаетесь привязать его результат (который является None ) к команде. В этом конкретном случае это также приводит к бесконечной рекурсии, так как обратный вызов создаст новый экземпляр фрейма, который снова выполнит обратный вызов, который создаст другой фрейм и т. Д. Вместо вызова функции вам необходимо привязать функцию к команде.

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

Если вам нужно передать параметры этой функции (не здесь), вы можете использовать lambda :

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

Кроме того, вместо создания другого экземпляра Tk вы должны просто создать экземпляр Toplevel в Toplevel , т. Toplevel

 def doathing(): thing1 = tk.Toplevel() thing2 = TheThing(thing1) 
  • Использование len с функцией get (), дающей неверную статистику?
  • Сетка внутри рамки?
  • как установить имя пользователя и пароль в tkinter python
  • Скрытие диалогового окна командной строки в py2exe
  • Как изменить цвет кнопки с помощью tkinter
  • Python Tkinter, настройка функций обратного вызова кнопки с помощью цикла
  • Изменение размера виджета списка Tkinter при изменении размера окна
  • tkinter mac, свернуть экран
  • Python - лучший язык программирования в мире.