Почему черепаха открывает еще меньший экран, когда холст маленький? - PullRequest
3 голосов
/ 28 мая 2020

Я пытаюсь рисовать на маленьком экране 200x200 с помощью черепахи, однако рисунок не отображается в полном размере, он открывает меньшее окно, и мне нужно прокручивать вверх / вниз, влево / вправо (немного ), чтобы увидеть весь рисунок. У меня нет этой проблемы с большим windows. Как предотвратить это?

import turtle
import random

height, width = 200, 200
screen = turtle.Screen()
screen.setup(width, height)
screen.setworldcoordinates(0, 0, width, height)

t = turtle.Turtle()
t.speed(1)

for _ in range(5):
    t.penup()
    t.goto(random.randint(20, width-20), random.randint(0, height-40))
    t.pendown()
    t.circle(20)

изменить: снимок экрана , мне нужно окно фактического размера вместо прокрутки

Ответы [ 2 ]

3 голосов
/ 28 мая 2020

Вы можете изменить размер окна до 420 × 420.

Если вы не хотите изменять размер окна, я предлагаю изменить значения для ключей "canvwidth" и "canvheight" в turtle._CFG словарь:

import turtle
import random

height, width = 200, 200
screen = turtle.Screen()
screen.setup(width, height)
screen.setworldcoordinates(0, 0, width, height)

turtle._CFG.update({"canvwidth": width-20, "canvheight": height-20}) # Removing the scroll bars

t = turtle.Turtle()
t.speed(1)


for _ in range(5):
    t.penup()
    t.goto(random.randint(20, width-20), random.randint(0, height-40))
    t.pendown()
    t.circle(20)

screen.exitonclick()
1 голос
/ 28 мая 2020

Использование small windows в черепахе - это банка с червями. Если простое решение @ TheOneMusi c (+1) достаточно для ваших целей, go для него! В моей системе ваш вызов setworldcoordinates() избавляется от полос прокрутки, поэтому я даже не вижу проблемы. Таким образом, другим приблизительным решением может быть обновление до текущих Python и tkinter.

Однако ни то, ни другое не является точным решением. Если мы добавим код для рисования прямоугольника размером 200 x 200 вокруг нашей области рисования:

t.penup()
t.color('red')
t.goto(0, 0)  # because of setworldcoordinates()
t.pendown()
for _ in range(4):
    t.forward(200)
    t.left(90)

Мы получим перекос прямоугольника:

enter image description here

Для более точного решения этой проблемы используется более уродливый код:

from turtle import Screen, Turtle
from random import randint

TRUE_WIDTH, TRUE_HEIGHT = 200, 200

CURSOR_SIZE = 20  # for drawing frame around edge
RADIUS = 20
CHROME = 14  # magic number possibly derivable from tkinter

width, height = TRUE_WIDTH + CHROME, TRUE_HEIGHT + CHROME # needs to be slightly larger than 200 target

offset_x = CHROME / -2 + 2
offset_y = CHROME / 2 - 2

screen = Screen()
screen.setup(width, height)
screen.screensize(width/2, height/2)  # backing store needs to be smaller than window
screen.setworldcoordinates(0, 0, TRUE_WIDTH, TRUE_HEIGHT)

# Draw red frame around edge to "prove" drawing area
frame = Turtle(shape='square', visible=False)
frame.shapesize(TRUE_HEIGHT / CURSOR_SIZE, TRUE_WIDTH / CURSOR_SIZE)  # 200 x 200 frame
frame.color('red', 'white')
frame.penup()
frame.goto(TRUE_WIDTH/2 + offset_x, TRUE_HEIGHT/2 + offset_y)
frame.stamp()

turtle = Turtle()
turtle.speed('fastest')  # because I have no patience

for _ in range(5):
    turtle.penup()
    turtle.goto(randint(RADIUS, TRUE_WIDTH - RADIUS) + offset_x, randint(0, TRUE_HEIGHT - RADIUS*2) + offset_y)
    turtle.pendown()
    turtle.circle(RADIUS)

screen.exitonclick()

enter image description here

Но такая детальная работа может быть легко отменена в будущем. выпуск черепахи и / или tkinter. Если вы можете жить с окном черепахи по умолчанию, жизнь станет проще.

...