我正在用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都具有预期的值。在
我已经试过了:
正如我在开头所说的,我可以通过在'pen()'中包含“resizemode='user'”和cfg文件,或者使用'shapesize()'。我只是想知道为什么我的cfg文件在所有情况下都不能达到预期的目的,我想更好地理解“turtle”模块和Python,如果我不明白为什么会发生这种情况,我肯定以后会遇到更严重的错误,而且我无法修复它们。在
这是我对你情况的分析。代码的关键是:
有两件事可能并不明显:
忽略
turtle.readconfig()
的参数。相反,它看起来 硬编码文件名“海龟.cfg“在哪里的目录里 *.py源文件来自和当前工作目录。在 那个命令。如果两者都是,则第二个优先加载 存在。(还有第三个可能的配置文件我不会去 进入这里。)如果
os.chdir()
跟在import turtle
之后,它就看不到了 对于您刚刚更改到的目录中的配置文件。 如果您愿意,os.chdir()
必须在import turtle
之前 它可以在chdir'd目录中查找。即使有明确的turtle.readconfig()
要演示第二点,首先在临时目录中创建一个配置文件:
^{pr2}$运行此代码:
^{3}$您将获得默认的
noresize
模式。使用此修改再次运行代码:您将得到模式
user
。在最后,如turtle文档中所述,}调用,而{}是用参数调用的。在
resizemode('user')
由{相关问题 更多 >
编程相关推荐