В настоящее время я пишу модуль (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 - это модуль черепахи, а trI - экземпляр RawTurtle.
Я заметил, например, что trM.forward(10)
применяется на экране по умолчанию, а trI.forward (x) применяется наэкран tkinter. Кроме того, такие функции, как forward (x) (после выполнения from turtle import *
), фактически вызывают trM.TNavigator.forward (trI, x).
Turtle достаточно запутал меня, чтобы я смог написать рекурсивный инспектор объектов, но я до сих пор не могу сказать, что нужно изменить.