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()