如何防止python';从打开默认窗口中删除模块?

如何防止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),它可以创建tkinter画布并将一个海龟附加到画布上。 模块的这一部分已经完成。然而,由于某些原因,海龟在连接到tkinter画布时仍然会打开另一个窗口。我想避免这种情况,但我不知道如何避免,而且海龟文档非常可怕

以下是我迄今为止所做工作的相关部分:

#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()

要吸取的教训是检查您正在创建的定义,以防覆盖重要的定义

我简直不敢相信,当解决方案如此简单的时候,我竟然去挖掘