Как я могу запретить модулю черепахи python открывать окно по умолчанию? - PullRequest
0 голосов
/ 17 октября 2019

В настоящее время я пишу модуль (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 достаточно запутал меня, чтобы я смог написать рекурсивный инспектор объектов, но я до сих пор не могу сказать, что нужно изменить.

1 Ответ

0 голосов
/ 18 октября 2019

Хорошо, я нашел, где я ошибся.

Исправление должно использовать:

if elem != "mainloop":
    d[elem] = obj

Вместо просто d[elem] = obj

Оказывается, что по умолчаниюОкно создается при вызове mainloop () от turtle.

Теоретически mainloop () в userProgram - это mainloop () в myModule. К сожалению, из-за attachTurtle () (а точнее d[elem] = obj) это определение перезаписывается функцией main черепахи (). Поэтому исправление состоит в том, чтобы просто не допустить, чтобы метод attachTurtle () изменил mainloop ().

Урок, который необходимо извлечь, - это проверить, какие определения вы создаете, на случай, если вы перезаписываете важное.

Не могу поверить, что копался в исходном коде , когда решение было таким простым

...