使Python turtle窗口大小与画布大小相同

3
我正在使用Python turtle绘制叙利亚国旗,暂时省略了两颗绿色的星星,因为它们需要一个外部依赖项(哦哇,这是一个意外的政治双关语?LOL)。以下是代码:
from turtle import *

# Set up the drawing environment
length = 600
height = 400
setup(length, height)
setworldcoordinates(0,0,length,height)
goto(0,0)
colours = ["red","black","white","Darkgreen"]
bgcolor(colours[0])
speed('fastest')

## Black Stripe ##

pencolor(colours[1])
pendown()
fillcolor(colours[1])
begin_fill()
goto(length,0)
goto(length,height/3)
goto(0,height/3)
goto(0,0)
end_fill()
penup()

# White Stripe

goto(0,height/3)
pencolor(colours[2])
pendown()
fillcolor(colours[2])
begin_fill()
goto(length,height/3)
goto(length,(height/3)*2)
goto(0,(height/3)*2)
goto(0,height/3)
end_fill()
penup()

ht()
done()

为什么图片周围有红色边框?我已经设置了画布大小和坐标系统相等,使得1个像素等于1个像素。例如,黑色盒子应该从画布的左下角开始,如我所说,但实际上出现了红色边框。如果你在运行代码后手动调整窗口大小,无论你试图让它多小以重叠红色边框,都会出现红色边框。我甚至没有在代码中写入边框。
我认为这可能与Python turtle的内部有关,它允许一个小边框以便看到坐标(0,0)上的内容,但我找不到任何实际显示turtle工作方式的文档,它们只是说类似"setup(x,y) = 设置画布大小"或者 bgcolor("输入颜色"),并没有解释构成函数的任何定义。
有谁知道怎么做到:
1.去掉边框?
2.使窗口大小等于画布大小,从而覆盖红色边框?
谢谢!
(编辑:顺便说一句,screensize(length,height)会给我带来红色边框和滚动条)

无法解释为什么会出现边框,但如果您将setworldcoordinates行更改为setworldcoordinates(10,10,length,height),它就会消除大部分问题。 - SiHa
@SiHa 谢谢,我想知道那10个像素的差异是什么原因?而且我想知道为什么画布的底部和右侧边缘总是有边框线,无论尝试了什么? - Christ Yensen
我认为这应该归咎于 TKinter 的一个 bug。第一次拖动窗口时,“边框”会发生变化 :) - SiHa
@SiHa - 哦,好的。Tkinter画布有一个highlightthickness选项,默认设置为1像素。不确定是否可以更改它,除非我从头开始制作一个tk窗口,这将违背使用turtle的初衷... 我认为这肯定更接近问题的核心。干杯。 - Christ Yensen
1个回答

0
不确定是否可以修改它,除非我从头开始制作一个tk窗口,这将违背使用turtle的初衷。
您可以使用tkinter创建窗口结构,然后在其中嵌入一个turtle画布。以下是以这种方式完成的程序示例,您可以在turtle的ScrolledCanvas和tkiner的普通Canvas之间切换以查看差异:
import tkinter as tk
from turtle import TurtleScreen, RawTurtle, ScrolledCanvas

WIDTH, HEIGHT = 640, 480

root = tk.Tk()

canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT)
# canvas = ScrolledCanvas(root, width=WIDTH, height=HEIGHT)
canvas.pack()

screen = TurtleScreen(canvas)
screen.setworldcoordinates(0, 0, WIDTH, HEIGHT)
screen.bgcolor('red')

turtle = RawTurtle(screen, visible=False)
turtle.speed('fastest')

## Black Stripe ##

turtle.color('black')

turtle.begin_fill()
turtle.setx(WIDTH)
turtle.sety(HEIGHT / 3)
turtle.setx(0)
turtle.sety(0)
turtle.end_fill()

## White Stripe ##

turtle.penup()
turtle.sety(HEIGHT / 3)
turtle.pendown()

turtle.color('white')

turtle.begin_fill()
turtle.setx(WIDTH)
turtle.sety(2 * HEIGHT / 3)
turtle.setx(0)
turtle.sety(HEIGHT / 3)
turtle.end_fill()

screen.mainloop()

ScrolledCanvas引入了更多的chrome(边框和其他开销),这会使事情发生变化,有时是不希望的。下面是一个垂直切片,显示了普通Canvas(左侧)和ScrolledCanvas(右侧)之间的差异:

enter image description here

随着窗口中添加更多的 Chrome,绘图区域会稍微移动。尽管您在输出中看到了大量偏移,在移动窗口时部分消失,但这显然是一个错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接