更改 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 有限。我正在寻找的是:
- 移动显示区域使海龟居中
- 也动图
- 具有无限滚动区域
- 不显示滚动条
- 可以用函数快速调用
我最好的猜测是能够以某种方式无限滚动 canvas,然后隐藏滚动条并根据海龟位置设置它们。
这在 Python 2.7 中可行吗?我不介意它是否也使用 tkinter。
编辑:6-3-15
我找到了 canvas.xview
和 canvas.yview
函数,但是一旦我定义了 screen = turtle.TurtleScreen(canvas)
,它们似乎就不起作用了,而且 TurtleScreen 没有 xview
或 yview
函数。我似乎无法完成这项工作。
然后我找到了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()等函数可以在静态背景下产生运动的错觉,但它会重置绘图。
我可以更改 Python 乌龟 canvas 上的滚动区域吗?我希望绘图随之移动,而不仅仅是移动坐标。我想要的外观是横向卷轴式的,屏幕的显示区域移动到屏幕上乌龟的中心。
我试过使用 turtle.setworldcoordinates(llx, lly, urx, ury)
,但是,从文档中可以看出,“这执行了 screen.reset()
”。我也看过 this SO question ,但这涉及滚动条,不会轻易使乌龟居中,并且 canvas space 有限。我正在寻找的是:
- 移动显示区域使海龟居中
- 也动图
- 具有无限滚动区域
- 不显示滚动条
- 可以用函数快速调用 我最好的猜测是能够以某种方式无限滚动 canvas,然后隐藏滚动条并根据海龟位置设置它们。
这在 Python 2.7 中可行吗?我不介意它是否也使用 tkinter。
编辑:6-3-15
我找到了 canvas.xview
和 canvas.yview
函数,但是一旦我定义了 screen = turtle.TurtleScreen(canvas)
,它们似乎就不起作用了,而且 TurtleScreen 没有 xview
或 yview
函数。我似乎无法完成这项工作。
然后我找到了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()等函数可以在静态背景下产生运动的错觉,但它会重置绘图。