【问题标题】:Python Turtle ScrollbarsPython Turtle 滚动条
【发布时间】:2019-07-25 13:42:50
【问题描述】:

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

以下代码生成下面的图像。对于 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]

【问题讨论】:

    标签: python turtle-graphics


    【解决方案1】:

    有谁知道如何防止 Turtle 上出现滚动条 Python中的图形窗口

    答案可能是在 tkinter 中使用 turtleembedded 而不是 standalone。因为独立的海龟默认使用ScrolledCanvas,而嵌入式海龟允许你使用它,或者干脆坚持基本的Canvas

    也就是说,以下是使用独立海龟实现此目的的三种不同方法:

    1) 只需将方形窗口从 400 x 400 增加到 420 x 420:

    screen.setup(420, 420)
    

    之所以可行,是因为 turtle 已将窗口和画布的默认大小存储在其全局 _CFG 配置字典中:

    _CFG = {
        "width" : 0.5,  # Screen
        "height" : 0.75,
        "canvwidth" : 400,
        "canvheight": 300,
        # ...
        }
    

    低于此画布大小,会出现滚动条。除了我们可以在setworldcoordinates() 中看到的窗口 chrome 有一个软糖因素:

     self.screensize(wx-20, wy-20)
    

    因此,除非画布也重新调整,否则任何 420 x 320 或更大的窗口都不应默认获得滚动条。

    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) 修补独立海龟的_Root 类的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)
    
    # ...
    

    【讨论】:

      【解决方案2】:

      已编辑

      确保边距值尽可能小,会使画布的笛卡尔平面的原点尽可能靠近屏幕中心。我有一个实用程序类,我把它放在下面的question 上,它有助于调整窗口的属性以找出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)
      

      基本上只是确保画布比屏幕尺寸小几个单位,并注意欺骗screensize() 方法。

      【讨论】:

        猜你喜欢
        • 2013-01-21
        • 2017-06-12
        • 2021-12-14
        • 2019-07-24
        • 2018-03-11
        • 2020-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多