Window 随 Python 乌龟 setworldcoordinates() 移动
Window shifts with Python Turtle setworldcoordinates()
我注意到在使用 Screen.setworldcoordinates()
时 Python Turtle Graphics 出现了一个奇怪的问题。出于某种原因,当我单击下面代码 运行 之后的 window 标题栏时,window 的内容发生了微小但可察觉的变化。谁能解释一下这种现象,让我知道是否有办法避免这种情况?我在 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 自带 default config,使用显示器宽度的 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
是 read-only。
制作了一个具有写入权限的本地副本,然后修改它以用于调试目的。相反,命名为 turtel.py,只是为了保持更改独立。输入一些 print()
语句来确定函数何时为 运行.
方法一:
您可以在屏幕构建之前通过强制新值来修复它。
通过在与脚本相同的目录中提供您自己的 turtle.cfg
,或者
方法二:
覆盖这些值:
import turtle
Width, Height = 500, 500
turtle._CFG['canvwidth'], turtle._CFG['canvheight'] = Width, Height
screen = turtle.Screen()
方法三:
_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()
我注意到在使用 Screen.setworldcoordinates()
时 Python Turtle Graphics 出现了一个奇怪的问题。出于某种原因,当我单击下面代码 运行 之后的 window 标题栏时,window 的内容发生了微小但可察觉的变化。谁能解释一下这种现象,让我知道是否有办法避免这种情况?我在 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 自带 default config,使用显示器宽度的 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
是 read-only。
制作了一个具有写入权限的本地副本,然后修改它以用于调试目的。相反,命名为 turtel.py,只是为了保持更改独立。输入一些 print()
语句来确定函数何时为 运行.
方法一:
您可以在屏幕构建之前通过强制新值来修复它。
通过在与脚本相同的目录中提供您自己的 turtle.cfg
,或者
方法二:
覆盖这些值:
import turtle
Width, Height = 500, 500
turtle._CFG['canvwidth'], turtle._CFG['canvheight'] = Width, Height
screen = turtle.Screen()
方法三:
_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()