如何解决Turtle绑定大尺寸Tkinter Canvas时坐标原点偏移问题
我在代码示例中设置了两组测试场景。我使用Tkinter和Turtle首先创建了一张仅1000×1000像素的图像,可以看到此时原点位于图像中心(而非常见的左上角),x轴正方向向右,y轴正方向向上,与我们初学的标准xy平面一致。
但似乎存在某个尺寸阈值,当创建的Canvas超过该阈值时,坐标系统会发生变化:原点移动到左上角位置,但「向下」仍为y轴负方向。我的最小可复现示例(MRE)的后半部分中,20000×20000像素Canvas的原点就位于(10000, -10000)处。
有没有方法可以避免该问题?有人知道该问题的成因吗?如果没有可以通过Tk.Canvas()对象的.configure()方法传入的默认设置,我要如何自定义Turtle的世界坐标,才能保证原点的位置不受Canvas尺寸影响?
最小可复现代码
import turtle import tkinter as tk from PIL import Image Image.MAX_IMAGE_PIXELS = None def rectangle(t: turtle.RawTurtle, x0, y0, x1, y1, color: tuple): t.penup() t.goto(x0,y0) t.pendown() t.color(color) t.begin_fill() t.goto(x1,y0) t.goto(x1,y1) t.goto(x0,y1) t.goto(x0,y0) t.end_fill() t.penup() root = tk.Tk() canw = 1000 canh = 1000 origin_x = 0 origin_y = 0 canvas1 = tk.Canvas(root) canvas1.configure(width=canw, height=canh) canvas1.config(bg='black') canvas1.pack() screen1 = turtle.TurtleScreen(canvas1) screen1.colormode(255) screen1.tracer(0) t1 = turtle.RawTurtle(screen1) t1.speed(0) t1.hideturtle() t1.pensize(2) print(t1.pos()) rectangle(t1, -canw, -canh, canw, canh, (0,0,0)) t1.pencolor((255,255,255)) t1.goto(0,0) t1.pendown() t1.circle(canw/2) t1.penup() t1.goto(0,0) t1.pendown() t1.goto(canw,0) t1.penup() t1.goto(0,0) t1.pendown() t1.goto(0,canh) t1.penup() screen1.update() canvas1.postscript(file='new_canvas_test_1.eps', width=canw, height=canh) img = Image.open('new_canvas_test_1.eps') img.save('new_canvas_test_1.jpg') img.close() t1.clear() screen1.clear() canvas1.destroy() # Brand new everything after this point except root Tk object canvas2 = tk.Canvas(root) canvas2.configure(width=20000, height=20000) canvas2.config(bg='black') canvas2.pack() screen2 = turtle.TurtleScreen(canvas2) screen2.colormode(255) screen2.tracer(0) t2 = turtle.RawTurtle(screen2) t2.speed(0) t2.hideturtle() t2.pensize(2) print(t2.pos()) rectangle(t2, -20000, -20000, 20000, 20000, (0,0,0)) t2.pencolor((255,255,255)) t2.goto(10000,-10000) t2.pendown() t2.circle(20000/4) t2.penup() t2.goto(0,-10000) t2.pendown() t2.goto(20000,-10000) t2.penup() t2.goto(10000,0) t2.pendown() t2.goto(10000,-20000) t2.penup() screen2.update() canvas2.postscript(file='new_canvas_test_2.eps', width=20000, height=20000) img = Image.open('new_canvas_test_2.eps') img.save('new_canvas_test_2.jpg') img.close() t2.clear() screen2.clear() canvas2.destroy()
输出结果
以下是两张输出图像,大尺寸图像已按比例缩小:

可以看到,为了让两张图像内容一致,我不得不完全修改原点坐标,而非直接在更大的画布上创建相同的图像。
感谢大家提供的思路与帮助!
内容的提问来源于stack exchange,提问作者Darren Woodson
相关产品推荐
相关产品推荐

