Непреднамеренная рекурсия 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) 
  • Текстовая запись Tkinter с pyHook висит в графическом интерфейсе
  • Распределение приложений для Python GUI: записано в wxPython, TKinter или QT
  • Python, Tkinter: если есть возможность установить флажки по умолчанию?
  • как проверить, нажата ли клавиша ввода python
  • Как реализовать шаблон MVC в Tkinter
  • Матрица с изображением на tkinter Canvas
  • Программно открывать URL-адреса в веб-браузере в Python
  • Tkinter и потоки
  • Отображение фотографий в ярлыках с помощью инструкции for с помощью tkinter, можно ли это сделать?
  • Понимание родителя и контроллера в Tkinter __init__
  • Печать кнопки Python tkinter PY_VAR0
  • Python - лучший язык программирования в мире.