Python 乌龟滚动条

Python Turtle Scrollbars

有谁知道如何防止滚动条出现在 Python 中的 Turtle Graphics window 上,请问小 window 尺寸?

以下代码生成下图。对于 600 像素 x 600 像素的屏幕,滚动条不会出现。

import turtle

TURTLE_SIZE = 20
TRIANGLE_SIZE = 120

screen = turtle.Screen()
screen.setup(400, 400)

triangle = turtle.Turtle("triangle")
triangle.shapesize(TRIANGLE_SIZE / TURTLE_SIZE)
triangle.color("pink")
triangle.right(30)][1]][1]

Does anyone know how to prevent scrollbars appearing on the Turtle Graphics window in Python

答案可能是在 tkinter 中使用 turtle embedded 而不是 standalone。由于独立 turtle 默认使用 ScrolledCanvas,而嵌入式 turtle 允许您使用它,或者简单地坚持基本的 Canvas.

也就是说,这里有三种不同的方法可以使用独立的 turtle 来实现:

1) 只需将正方形 window 从 400 x 400 增加到 420 x 420:

screen.setup(420, 420)

这是有效的,因为 turtle 已将 window 和 canvas:

的默认大小存储在它的全局 _CFG 配置字典中
_CFG = {
    "width" : 0.5,  # Screen
    "height" : 0.75,
    "canvwidth" : 400,
    "canvheight": 300,
    # ...
    }

低于这个 canvas 大小,滚动条出现。除了有一个软糖因素来解释 window chrome 我们可以在 setworldcoordinates():

中看到
 self.screensize(wx-20, wy-20)

因此任何 window 420 x 320 或更大的尺寸在默认情况下都不应获得滚动条,除非 canvas 也进行了重新调整。

2) 通过"turtle.cfg" 文件操作_CFG 字典。与 turtle.pen() 方法动态创建的仿 _pd 笔字典不同,turtle._CFG 字典没有运行时用户界面,除非我们在引擎盖下四处寻找:

from turtle import Screen, Turtle, _CFG

TURTLE_SIZE = 20
TRIANGLE_SIZE = 120

_CFG.update({"canvwidth": 380, "canvheight": 380})  # 400 - 20

screen = Screen()
screen.setup(400, 400)

triangle = Turtle("triangle")
triangle.shapesize(TRIANGLE_SIZE / TURTLE_SIZE)
triangle.color("pink")
triangle.right(30)

screen.exitonclick()

3) 修补独立 turtle 的 _Root class 的 setupcanvas 方法,用通用 Canvas 代替 ScrolledCanvas。这消除了对任何幻数的需要,并且将简单地关闭滚动:

import tkinter as TK
from turtle import Screen, Turtle, _Root

def setupcanvas(self, width, height, cwidth, cheight):
    self._canvas = TK.Canvas(self, width=cwidth, height=cheight)
    self._canvas.pack(expand=1, fill="both")

_Root.setupcanvas = setupcanvas

TURTLE_SIZE = 20
TRIANGLE_SIZE = 120

screen = Screen()
screen.setup(400, 400)

# ...

已编辑

保证margin值尽可能小,会让canva的笛卡尔平面原点尽可能靠近屏幕中心。我有一个实用程序 class,我把它放在下面的 question 上,它有助于调整 window 的属性以找出 margin

的最佳值

我在学习 turtle 时遇到了这个问题。以下方法对我有用:

from turtle import Turtle

donatello = Turtle("turtle")
donatello.color("purple")  # just to keep it real
screen = donatello.getscreen()
window_width = 200
window_height = 250
margin = 2  # minimum difference between window size and canvas size to avoid scrollbars
screen.screensize(  # despite the name, screensize() does not change window/screen's size
    canvwidth=window_width - margin,  # named parameters give a hint of method's real goal
    canvheight=window_height - margin)  # canvas has to be smaller than window
screen.setup(window_width, window_height)  # setup() will change window/screen's size
print(f"screensize(canvas) = {screen.screensize()}\n"
      f"screen(width*height) = ({screen.window_width()} * {screen.window_height()})")
screen.exitonclick()

输出:

screensize(canvas) = (198, 248)
screen(width*height) = (200 * 250)

基本上就是保证canvas比屏幕尺寸小几个单位,谨防骗人的screensize()方法