使用Python Turtle setworldcoordinates()进行窗口移位



在使用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()

最新更新