如何防止python';从打开默认窗口中删除模块?
我目前正在编写一个模块(myModule),它可以创建tkinter画布并将一个海龟附加到画布上。 模块的这一部分已经完成。然而,由于某些原因,海龟在连接到tkinter画布时仍然会打开另一个窗口。我想避免这种情况,但我不知道如何避免,而且海龟文档非常可怕 以下是我迄今为止所做工作的相关部分:如何防止python';从打开默认窗口中删除模块?,python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,我目前正在编写一个模块(myModule),它可以创建tkinter画布并将一个海龟附加到画布上。 模块的这一部分已经完成。然而,由于某些原因,海龟在连接到tkinter画布时仍然会打开另一个窗口。我想避免这种情况,但我不知道如何避免,而且海龟文档非常可怕 以下是我迄今为止所做工作的相关部分: #myModule import tkinter as tk import turtle as tr import inspect as ins from functools import partial
#myModule
import tkinter as tk
import turtle as tr
import inspect as ins
from functools import partial
_root = None
_canvas = None
_turtle = None
d = None
def openWindow():
global _root
global d
if d == None:
myFrame = sys._getframe()
aboveFrameName = myFrame.f_back.f_back.f_back.f_globals["__name__"] #This doesnt make sense, but it works.
userModule = sys.modules[aboveFrameName]
d = userModule.__dict__
_root = tk.Tk()
def attachCanvas():
global _canvas
if _root == None:
openWindow()
_canvas = tk.Canvas(_root, bd = 0, highlightthickness = 0, width = 500, height = 500)
_canvas.pack()
def attachTurtle():
global _turtle
global _canvas
global _screen
global d
if _canvas == None:
attachCanvas()
_turtle = tr.RawTurtle(_canvas)
for key in tr.__dict__.keys():
obj = None
if key in tr.TNavigator.__dict__.keys(): #Checks if the object also exists in TNavigator
obj = getattr(tr.TNavigator, key)
if hasattr(obj, "__call__") and ("self" in ins.getargspec(obj)[0]): #Checks if the function
uses a self argument
obj = partial(obj, _turtle) #Pass in the turtle we just created automatically
else:
obj = getattr(tr, key)
d[key] = obj #Transfer object reference from myModule to userProgram
return _turtle
def mainloop():
tk.mainloop()
#userProgram
from myModule import *
attachTurtle()
forward(100)
mainloop()
注意:假设trM是turtle模块,trI是RawTurtle的一个实例
例如,我注意到默认屏幕上应用了trM.forward(10)
,而tkinter屏幕上应用了trI.forward(x)。另外,forward(x)等函数(在从turtle import*完成之后)实际上正在调用trM.TNavigator.forward(trI,x)
Turtle已经把我弄糊涂了,以至于我编写了一个递归对象检查器,但我仍然无法判断需要更改什么。好的,我找到了哪里出了问题
解决方案是使用:
如果元素!=“主循环”:
d[elem]=obj
而不仅仅是d[elem]=obj
结果表明,默认窗口是在调用turtle的mainloop()时创建的
理论上,userProgram中的mainloop()是myModule中的mainloop()。不幸的是,由于attachTurtle()(更具体地说是d[elem]=obj
),这个定义会被海龟的mainloop()覆盖。因此,修复只是为了防止attachTurtle()更改mainloop()
要吸取的教训是检查您正在创建的定义,以防覆盖重要的定义
我简直不敢相信,当解决方案如此简单的时候,我竟然去挖掘