更改 canvas Python 乌龟 canvas 上的滚动区域

Changing canvas scroll region on Python turtle canvas

我可以更改 Python 乌龟 canvas 上的滚动区域吗?我希望绘图随之移动,而不仅仅是移动坐标。我想要的外观是横向卷轴式的,屏幕的显示区域移动到屏幕上乌龟的中心。

我试过使用 turtle.setworldcoordinates(llx, lly, urx, ury),但是,从文档中可以看出,“这执行了 screen.reset()”。我也看过 this SO question ,但这涉及滚动条,不会轻易使乌龟居中,并且 canvas space 有限。我正在寻找的是:

这在 Python 2.7 中可行吗?我不介意它是否也使用 tkinter。

编辑:6-3-15

我找到了 canvas.xviewcanvas.yview 函数,但是一旦我定义了 screen = turtle.TurtleScreen(canvas),它们似乎就不起作用了,而且 TurtleScreen 没有 xviewyview 函数。我似乎无法完成这项工作。

然后我找到了turtle.ScrolledCanvas()。这看起来很理想,除了它没有从程序中手动设置滚动的方法。我可以在 turtle.ScrolledCanvas() 上手动设置滚动条吗???

可以使用 canvas.place() 方法更改 canvas 的位置而无需重置。它会移动乌龟和图纸,所以每次移动乌龟都需要重新定位。

下一个代码使用向左和向右箭头移动 canvas 并使用 Space 绘制一个圆圈,同时保持乌龟在中心。不需要 ScrolledCanvas,只是一个非常大的标准 canvas:

import turtle
import Tkinter as tk


def keypress(event):
    global xx, canvas, t, speed
    ev = event.keysym
    if ev == 'Left':
        xx += speed
    else:
        xx -= speed

    canvas.place(x=xx)
    t.setposition((-canvas.winfo_width() / 4) - (xx + 250), 0)
    return None


def drawCircle(_):
    global t
    t.pendown()
    t.fillcolor(0, 0, 1.0)
    t.fill(True)
    t.circle(100)
    t.fill(False)
    t.fillcolor(0, 1, 0)
    t.penup()

# Set the main window
window = tk.Tk()
window.geometry('500x500')
window.resizable(False, False)

# Create the canvas. Width is larger than window
canvas = turtle.Canvas(window, width=2000, height=500)
xx = -500
canvas.place(x=xx, y=0)

# Bring the turtle
t = turtle.RawTurtle(canvas)
t.shape('turtle')  # nicer look
t.speed(0)
t.penup()
t.setposition((-canvas.winfo_width() / 4) - (xx + 250), 0)

# key binding
window.bind('<KeyPress-Left>', keypress)
window.bind('<KeyPress-Right>', keypress)
window.bind('<KeyPress-space>', drawCircle)

drawCircle(None)
speed = 3  # scrolling speed
window.mainloop()

真正的 无限滚动将需要每次使用所需的偏移重新绘制 canvas 中的每个项目,而不是实际移动或滚动 canvas. create_image()等函数可以在静态背景下产生运动的错觉,但它会重置绘图。