在使用Screen.setworldcoordinates()
时,我注意到Python Turtle Graphics出现了一个奇怪的问题。出于某种原因,当我在运行下面的代码后单击窗口标题栏时,窗口的内容发生了微小但可察觉的变化。有人能解释一下这种现象吗?如果有办法避免的话,请告诉我?我使用的是Windows 10和Python 3.8。
import turtle
screen = turtle.Screen()
screen.setup(500, 500) # Set the dimensions of the Turtle Graphics window.
screen.setworldcoordinates(0, screen.window_height(), screen.window_width(), 0)
my_turtle = turtle.Turtle(shape="circle")
my_turtle.color("red")
my_turtle.forward(10)
turtle.done()
turtle自带默认配置,使用显示器宽度的50%和高度的75%。
_CFG = {"width" : 0.5, # Screen
"height" : 0.75,
"canvwidth" : 400,
"canvheight": 300,
...
}
在施工过程中,各种元素之间存在一些相互作用。
self._canvas = TK.Canvas(master, width=width, height=height,
bg=self.bg, relief=TK.SUNKEN, borderwidth=2)
将borderwidth
设置为3以上的任何值都会减轻它;相信这是因为它需要一个完整的屏幕重绘/usr/lib/python3.9/turtle.py
是只读的。
使用write-privs制作了一个本地副本,然后为了调试目的对其进行了修改。改为命名为turtel.py,只是为了将更改分开。放入一些print()
语句,以了解函数何时运行。
方法1:
您可以通过在构建屏幕之前强制使用新值来修复它
通过在与脚本相同的目录中提供自己的turtle.cfg
,或者
方法2:
覆盖这些值:
import turtle
Width, Height = 500, 500
turtle._CFG['canvwidth'], turtle._CFG['canvheight'] = Width, Height
screen = turtle.Screen()
方法3:
_setscrollregion(self, srx1, sry1, srx2, sry2)
调用_rescale(self, xscalefactor, yscalefactor)
但是在拖动标题栏之后,直到调用onResize(self, event)
之后才调用adjustScrolls(self)
。
因此,您可以在screen.setworldcoordinates(0, Height, Width, 0)
之后强制重画
cv = screen.getcanvas()
cv.adjustScrolls()
取消对##
的注释以启用行,然后重试。
#! /usr/bin/python3
import turtle
## print( turtle._CFG['width'], turtle._CFG['height'] ) ## 0.5 0.75
## print( turtle._CFG['canvwidth'], turtle._CFG['canvheight'] ) ## 400 300
Width, Height = 500, 500
## turtle._CFG['width'], turtle._CFG['height'] = Width, Height
## turtle._CFG['canvwidth'], turtle._CFG['canvheight'] = Width, Height
screen = turtle.Screen()
screen.setworldcoordinates(0, Height, Width, 0)
## cv = screen.getcanvas()
## cv.adjustScrolls()
my_turtle = turtle.Turtle(shape='circle')
my_turtle.color('red')
my_turtle.forward(10)
def click_callback( x, y ):
cv = screen.getcanvas()
print( cv.width, cv.height, screen.screensize(), cv.winfo_width(), cv.winfo_height() )
print('<< initialized >>')
screen.onclick( click_callback )
screen.mainloop()