python – Tkinter – RuntimeError:超出最大递归深度
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – Tkinter – RuntimeError:超出最大递归深度,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7678字,纯文字阅读大概需要11分钟。
内容图文
![python – Tkinter – RuntimeError:超出最大递归深度](/upload/InfoBanner/zyjiaocheng/802/9023ab2e6b2c4b33998278569488ef4e.jpg)
我星期一开始用Python编程.我很高兴学习它.但是我很难理解如何在tkinter菜单之间切换时避免递归!我确信这是一个非常基本的问题,我感谢你容忍我对这个问题的无知,但我一直无法在其他地方找到答案.
我现在正在做的是,最终给我错误:RuntimeError:调用Python对象时超出了最大递归深度
这是我目前使用的模式.更新:下面的代码现在是一个完整的,孤立的副本,再现了我面临的问题! :d
from tkinter import *
def mainmenu():
global frame, root
frame.destroy()
frame = Frame()
frame.pack()
button1 = Button(frame, text="anothermenulikethis", command = anothermenulikethis)
button2 = Button(frame, text="anothermenulikethis", command = anothermenulikethis)
button3 = Button(frame, text="mainmenu", command = mainmenu)
button1.pack(side=LEFT)
button2.pack(side=LEFT)
button3.pack(side=LEFT)
root.mainloop()
def anothermenulikethis():
global frame, root
frame.destroy()
frame = Frame()
frame.pack()
button1 = Button(frame, text="mainmenu", command = mainmenu)
button2 = Button(frame, text="mainmenu", command = mainmenu)
button3 = Button(frame, text="anothermenulikethis", command = anothermenulikethis)
button1.pack(side=LEFT)
button2.pack(side=LEFT)
button3.pack(side=LEFT)
root.mainloop()
root = Tk()
root.title("Recursive Menu Problem Isolation")
root.geometry("1200x600")
frame = Frame()
mainmenu()
一切正常,直到最大递归深度不可避免的失败.如果任何人都可以提出更好的做事方式,或者有一个更好的方法的例子的链接,我渴望学习.
PS:我已经看过并尝试增加递归深度,但我觉得这是一个穷人解决我的方法的根本问题.
大家提前谢谢你.
根据要求,这里是追溯:
Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/tkinter/__init__.py", line 1399, in __call__
return self.func(*args)
File "/Users/diligentstudent/Desktop/menutest.py", line 11, in mainmenu
button1 = Button(frame, text="anothermenulikethis", command = anothermenulikethis)
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/tkinter/__init__.py", line 2028, in __init__
Widget.__init__(self, master, 'button', cnf, kw)
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/tkinter/__init__.py", line 1958, in __init__
(widgetName, self._w) + extra + self._options(cnf))
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/tkinter/__init__.py", line 1043, in _options
v = self._register(v)
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/tkinter/__init__.py", line 1079, in _register
f = CallWrapper(func, subst, self).__call__
RuntimeError: maximum recursion depth exceeded
解决方法:
只需要一个mainloop()来处理tkinter GUI.
话虽如此,我认为你只需要一个类结构的例子:
from tkinter import Tk,Button
class Application(Tk):
def say_hi(self):
print('Hello world?!')
def close_app(self):
self.destroy()
def create_Widgets(self):
self.quitButton = Button(self, width=12, text='Quit', bg='tan',
command=self.close_app)
self.quitButton.grid(row=0, column=0, padx=8, pady=8)
self.helloButton = Button(self, width=12, text='Hello',
command=self.say_hi)
self.helloButton.grid(row=0, column=1, padx=8, pady=8)
def __init__(self):
Tk.__init__(self)
self.title('Hello world!')
self.create_Widgets()
app = Application()
app.mainloop()
为避免与其他模块发生冲突,有些人更喜欢像这样导入
(明确说明一切来自哪里):
import tkinter as tk
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title('Hello world!')
self.quitButton = tk.Button(self, width=12, text='Quit', bg='tan',
command=self.close_app)
self.quitButton.grid(row=0, column=0, padx=8, pady=8)
self.helloButton = tk.Button(self, width=12, text='Hello',
command=self.say_hi)
self.helloButton.grid(row=0, column=1, padx=8, pady=8)
def say_hi(self):
print('Hello world?!')
def close_app(self):
self.destroy()
app = Application()
app.mainloop()
正如您所看到的,创建小部件很容易发生在__init__中
我决定根据我过去一个月学到的内容,制作一个更实用/更有教育意义的例子.虽然这样做我有一点启示:并非一切都需要一个自我.一个类中的前缀!对于tkinter类尤其如此,因为您没有将其作为主程序中的对象进行操作.大多数情况下你需要自我.当你打算稍后在方法中使用某些东西时的前缀.前面的示例显示了任何内容(如按钮)如何接收自己.前缀,即使完全没必要.
这个例子会显示一些事情:
?pack()和grid()可以在同一个GUI中使用,只要它们不共享主服务器即可.
?当字体大小更改时,可以使“文本”窗口小部件不展开.
?如何在所选文本上打开和关闭粗体标记.
?如何在屏幕上真正居中GUI. (more information here)
?如何使Toplevel窗口显示在相对于主窗口的相同位置.
?两种防止Toplevel窗口被破坏的方法,因此只需要创建一次.
?正确执行ctrl a(全选)功能.
import tkinter as tk
import tkFont
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title('T-Pad')
# Menubar
menubar = tk.Menu(self)
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="Exit", command=self.close_app)
menubar.add_cascade(label="File", menu=filemenu)
formatmenu = tk.Menu(menubar, tearoff=0)
formatmenu.add_command(label="Font", command=self.show_sizeWin)
menubar.add_cascade(label="Format", menu=formatmenu)
self.config(menu=menubar)
# Bold Button
boldButton = tk.Button(self, width=12, text='Bold',
command=self.make_bold)
boldButton.pack()
# Text widget, its font and frame
self.defaultFont = tkFont.Font(name="defFont")
textFrame = tk.Frame(self, borderwidth=1, relief="sunken",
width=600, height=600)
textFrame.grid_propagate(False) # ensures a consistent GUI size
textFrame.pack(side="bottom", fill="both", expand=True)
self.mText = tk.Text(textFrame, width=48, height=24, wrap='word',
font="defFont")
self.mText.grid(row=0, column=0, sticky="nsew")
# Scrollbar and config
tScrollbar = tk.Scrollbar(textFrame, command=self.mText.yview)
tScrollbar.grid(row=0, column=1, sticky='nsew', pady=1)
self.mText.config(yscrollcommand=tScrollbar.set)
# Stretchable
textFrame.grid_rowconfigure(0, weight=1)
textFrame.grid_columnconfigure(0, weight=1)
# Bold Tag
self.bold_font = tkFont.Font(self.mText, self.mText.cget("font"))
self.bold_font.configure(weight="bold")
self.mText.tag_configure("bt", font=self.bold_font)
# Center main window
self.update_idletasks()
xp = (self.winfo_screenwidth() / 2) - (self.winfo_width() / 2) - 8
yp = (self.winfo_screenheight() / 2) - (self.winfo_height() / 2) - 30
self.geometry('{0}x{1}+{2}+{3}'.format(self.winfo_width(), self.winfo_height(),
xp, yp))
# Font Size Window (notice that self.sizeWin is given an alias)
sizeWin = self.sizeWin = tk.Toplevel(self, bd=4, relief='ridge')
self.sizeList = tk.Listbox(sizeWin, width=10, height=17, bd=4,
font=("Times", "16"), relief='sunken')
self.sizeList.grid()
doneButton = tk.Button(sizeWin, text='Done', command=sizeWin.withdraw)
doneButton.grid()
for num in range(8,25):
self.sizeList.insert('end', num)
sizeWin.withdraw()
sizeWin.overrideredirect(True) # No outerframe!
# Below is another way to prevent a TopLevel window from being destroyed.
# sizeWin.protocol("WM_DELETE_WINDOW", self.callback)
# Bindings
# Double click a font size in the Listbox
self.sizeList.bind("<Double-Button-1>", self.choose_size)
self.bind_class("Text", "<Control-a>", self.select_all)
## def callback(self):
## self.sizeWin.withdraw()
def select_all(self, event):
self.mText.tag_add("sel","1.0","end-1c")
def choose_size(self, event=None):
size_retrieved = self.sizeList.get('active')
self.defaultFont.configure(size=size_retrieved)
self.bold_font.configure(size=size_retrieved)
def show_sizeWin(self):
self.sizeWin.deiconify()
xpos = self.winfo_rootx() - self.sizeWin.winfo_width() - 8
ypos = self.winfo_rooty()
self.sizeWin.geometry('{0}x{1}+{2}+{3}'.format(self.sizeWin.winfo_width(),
self.sizeWin.winfo_height(), xpos, ypos))
def make_bold(self):
try:
current_tags = self.mText.tag_names("sel.first")
if "bt" in current_tags:
self.mText.tag_remove("bt", "sel.first", "sel.last")
else:
self.mText.tag_add("bt", "sel.first", "sel.last")
except tk.TclError:
pass
def close_app(self):
self.destroy()
app = Application()
app.mainloop()
内容总结
以上是互联网集市为您收集整理的python – Tkinter – RuntimeError:超出最大递归深度全部内容,希望文章能够帮你解决python – Tkinter – RuntimeError:超出最大递归深度所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。