为什么我必须将“resizemode”设置为“user”两次,以便在使用“turtle”时对“stretchfactor”的更改生效?

2024-05-08 17:21:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python3.6.0自动化Cracker Barrel上的“三角桩游戏”,目前我正在用“turtle”实现它的图形。我创建的两个类与这个问题相关:“Game”(包含在主包的模块中)和“TurtleGraphics”(包含在子包“graphics”的模块中),它们的目的是不言而喻的。当以“TurtleGraphics”对象作为参数调用“Game”对象时,这两个对象相互链接,并调用“graphics.\u construct()”,它定义了一个“Pen”对象并使用“Pen()”设置其“stretchfactor”。这就是问题所在。即使我在我的海龟.cfg'文件,我必须再次将'resizemode'设置为'user'作为'pen()'的参数,以便在从游戏中调用时图形能够正确地构建。奇怪的是,如果我直接运行包含“TurtleGraphics”的模块并创建一个graphics对象,它可以正常工作。另外,使用'shapesize()'而不是'pen()'来设置'stretchfactor'即使在我从游戏对象中调用图形时也是有效的。首先,我将发布“Game.\uuu call_uqu”和“TurtleGraphics.\u construct”的代码,在每个代码前面加上模块的导入,这可能是相关的。我还将发布“TurtleGraphics.\uuInit_Uu”和“TurtleGraphics.\u draw_board”。(两个类都有基类,但是“BaseGame”不处理图形,“graphics”是抽象的,因此在本例中它们是无关的。另外,值得一提的是'Game'没有''uyu init\'u'方法。所有的实例属性在调用时都会被赋值。)然后我将解释我目前在这方面所做的研究。在

游戏。请致电:

from tripeg.graphics import Graphics
from tripeg.graphics.ascii_ import ASCIIGraphics
from tripeg.graphics.turtle_ import TurtleGraphics

#...

def __call__(self, graphics=None):
    """Starts the game with given graphics, or none, if not given."""
    super().__call__()
    if graphics:
        if not isinstance(graphics, Graphics):
            raise TypeError(f"Argument '{graphics}' is not of type"
                            " 'Graphics'.")
        else:
            self._graphics = graphics
            self._graphics._game = self
            self._graphics._construct()

套头衫。构造:

^{pr2}$

现在,我发现的是:

我使用“pdb”创建了一个断点,并将其直接放在调用“pen()”之后。当我运行游戏模块并调用游戏中的图形时,就像这样。。。在

>>> ga = Game()
>>> gr = TurtleGraphics()
>>> ga(gr)
> c:\users\sylvaenn\python3.6.0\programs\tripeg\graphics\turtle_.py(82)._draw_board()
-> board.setheading(90)
(Pdb) !board.pen()
{'shown': True, 'pendown': False, 'pencolor': 'black', 'fillcolor':   'black', 'pensize': 1, 'speed': 3, 'resizemode': 'noresize', 'stretchfactor': (71.46496815286623, 60), 'shearfactor': 0.0, 'outline': 7, 'tilt': 0.0}
(Pdb)

…“stretchfactor”已更改,但“resizemode”仍设置为“noresize”,尽管cfg文件已存在。在

如果我运行图形模块并直接调用图形,像这样。。。在

>>> gr = TurtleGraphics()
>>> gr._construct()
> c:\users\sylvaenn\python3.6.0\programs\tripeg\graphics\turtle_.py(82)_draw_board()
-> board.setheading(90)
(Pdb) !board.pen
{'shown': False, 'pendown': False, 'pencolor': 'black', 'fillcolor': 'black', 'pensize': 1, 'speed': 3, 'resizemode': 'user', 'stretchfactor': (71.46496815286623, 60), 'shearfactor': 0.0, 'outline': 7, 'tilt': 0.0}
(Pdb) 

…stretchfactor和resizemode都具有预期的值。在

我已经试过了:

  1. 分析了“turtle”的源代码,特别是“pen()”、“\CFG”、类“turtle”、“RawTurtle”及其基类
  2. 请广泛阅读python.org网站和方法docstrings
  3. 使用空闲调试器和“pdb”逐步运行程序

正如我在开头所说的,我可以通过在'pen()'中包含“resizemode='user'”和cfg文件,或者使用'shapesize()'。我只是想知道为什么我的cfg文件在所有情况下都不能达到预期的目的,我想更好地理解“turtle”模块和Python,如果我不明白为什么会发生这种情况,我肯定以后会遇到更严重的错误,而且我无法修复它们。在


Tags: 模块对象selfboardgame图形游戏construct
1条回答
网友
1楼 · 发布于 2024-05-08 17:21:24

I want to know why my cfg file isn't serving its intended purpose in all cases

这是我对你情况的分析。代码的关键是:

import turtle
#...
def __init__(self):
    os.chdir("C:\\Users\\Sylvaenn\\Python3.6.0\\Programs\\tripeg\\graphics")
    turtle.readconfig("turtle.cfg")

有两件事可能并不明显:

  1. 忽略turtle.readconfig()的参数。相反,它看起来 硬编码文件名“海龟.cfg“在哪里的目录里 *.py源文件来自和当前工作目录。在 那个命令。如果两者都是,则第二个优先加载 存在。(还有第三个可能的配置文件我不会去 进入这里。)

  2. 如果os.chdir()跟在import turtle之后,它就看不到了 对于您刚刚更改到的目录中的配置文件。 如果您愿意,os.chdir()必须在import turtle之前 它可以在chdir'd目录中查找。即使有明确的 turtle.readconfig()

要演示第二点,首先在临时目录中创建一个配置文件:

^{pr2}$

运行此代码:

^{3}$

您将获得默认的noresize模式。使用此修改再次运行代码:

import os

from os.path import isfile

current_directory = os.getcwd()

os.chdir("temporary_directory")

import turtle

turtle.readconfig(None)

print(turtle.resizemode())

您将得到模式user。在

最后,如turtle文档中所述,resizemode('user')由{}调用,而{}是用参数调用的。在

相关问题 更多 >