如何让 Turtle canvas 屏幕随 Turtle 模块一起移动?
How do I get the Turtle canvas screen to move with a Turtle module?
对于一个 class 项目,我正在尝试使用 Python (3.7.3) Turtle 制作一款 Rogue-like 游戏。我想知道 canvas 屏幕是否有可能以我的乌龟 "player" 模块为中心,这样它就不会超出用户的视野,并且用户不必使用滚动条。
我已经尝试查找许多不同的解决方案,但 none 似乎实际上是关于我的问题。我也试过查看 Python 网站的海龟部分,但我不知道会有什么帮助。
# Draw border
border_pen = turtle.Turtle()
border_pen.speed(0)
border_pen.color('black')
border_pen.penup()
border_pen.setposition(-600,-600)
border_pen.pendown()
border_pen.pensize(3)
for side in range(4):
border_pen.fd(600)
border_pen.lt(90)
border_pen.hideturtle()
以上只是我用来制作 canvas 本身的代码。如您所见,它相当大(这是必须的)。起初我不认为这是一个问题,但现在我发现这是一个相当困难的问题。正如我所说,我的模块可以移出屏幕。
下面是在 tkinter 级别操纵滚动以获得所需行为的示例。在本例中,我将乌龟固定在屏幕中央,但使用箭头键移动它下方的景观。
### Generate a landscape ...
和 ### Finished generating a ...
之间的代码来自我之前回答的一个 SO 问题,是为了制作一个有趣的分形景观来探索:
from turtle import Turtle, Screen
from random import random
MAGNIFICATION = 10
def move_left():
canvas.xview_scroll(-1, "units")
turtle.setx(turtle.xcor() - MAGNIFICATION)
def move_right():
canvas.xview_scroll(1, "units")
turtle.setx(turtle.xcor() + MAGNIFICATION)
def move_up():
canvas.yview_scroll(-1, "units")
turtle.sety(turtle.ycor() + MAGNIFICATION)
def move_down():
canvas.yview_scroll(1, "units")
turtle.sety(turtle.ycor() - MAGNIFICATION)
screen = Screen()
width, height = screen.screensize()
screen.screensize(width * MAGNIFICATION, height * MAGNIFICATION)
canvas = screen.getcanvas()
canvas.config(xscrollincrement=str(MAGNIFICATION))
canvas.config(yscrollincrement=str(MAGNIFICATION))
# turtle initialization
turtle = Turtle("turtle", visible=False)
turtle.width(MAGNIFICATION)
turtle.resizemode('auto')
### Generate a landscape to explore
screen.tracer(False)
RULES = {'x':'x+yf+', 'y':'-fx-y', 'f':'f', '+':'+', '-':'-'}
sub_string = string = "fx"
LEVEL = 13
for _ in range(LEVEL):
turtle.pencolor(random(), random(), random())
for character in sub_string:
if character == '+':
turtle.right(90)
elif character == '-':
turtle.left(90)
elif character == 'f':
turtle.forward(5 * MAGNIFICATION)
screen.update()
full_string = "".join(RULES[character] for character in string)
sub_string = full_string[len(string):]
string = full_string
screen.tracer(True)
### Finished generating a landscape to explore
turtle.penup()
turtle.home()
turtle.setheading(90)
turtle.color('dark green', 'light green')
turtle.showturtle()
screen.onkey(move_left, "Left")
screen.onkey(move_right, "Right")
screen.onkey(move_up, "Up")
screen.onkey(move_down, "Down")
screen.listen()
screen.mainloop()
滚动条反映了整个 space 的移动。不幸的是,滚动条仍然处于活动状态并且会使东西歪斜(改用箭头键),并且它需要在景观边缘附近工作,但这只是一个示例,表明如果您花时间探索 tkinter/Tk 基础。
对于一个 class 项目,我正在尝试使用 Python (3.7.3) Turtle 制作一款 Rogue-like 游戏。我想知道 canvas 屏幕是否有可能以我的乌龟 "player" 模块为中心,这样它就不会超出用户的视野,并且用户不必使用滚动条。
我已经尝试查找许多不同的解决方案,但 none 似乎实际上是关于我的问题。我也试过查看 Python 网站的海龟部分,但我不知道会有什么帮助。
# Draw border
border_pen = turtle.Turtle()
border_pen.speed(0)
border_pen.color('black')
border_pen.penup()
border_pen.setposition(-600,-600)
border_pen.pendown()
border_pen.pensize(3)
for side in range(4):
border_pen.fd(600)
border_pen.lt(90)
border_pen.hideturtle()
以上只是我用来制作 canvas 本身的代码。如您所见,它相当大(这是必须的)。起初我不认为这是一个问题,但现在我发现这是一个相当困难的问题。正如我所说,我的模块可以移出屏幕。
下面是在 tkinter 级别操纵滚动以获得所需行为的示例。在本例中,我将乌龟固定在屏幕中央,但使用箭头键移动它下方的景观。
### Generate a landscape ...
和 ### Finished generating a ...
之间的代码来自我之前回答的一个 SO 问题,是为了制作一个有趣的分形景观来探索:
from turtle import Turtle, Screen
from random import random
MAGNIFICATION = 10
def move_left():
canvas.xview_scroll(-1, "units")
turtle.setx(turtle.xcor() - MAGNIFICATION)
def move_right():
canvas.xview_scroll(1, "units")
turtle.setx(turtle.xcor() + MAGNIFICATION)
def move_up():
canvas.yview_scroll(-1, "units")
turtle.sety(turtle.ycor() + MAGNIFICATION)
def move_down():
canvas.yview_scroll(1, "units")
turtle.sety(turtle.ycor() - MAGNIFICATION)
screen = Screen()
width, height = screen.screensize()
screen.screensize(width * MAGNIFICATION, height * MAGNIFICATION)
canvas = screen.getcanvas()
canvas.config(xscrollincrement=str(MAGNIFICATION))
canvas.config(yscrollincrement=str(MAGNIFICATION))
# turtle initialization
turtle = Turtle("turtle", visible=False)
turtle.width(MAGNIFICATION)
turtle.resizemode('auto')
### Generate a landscape to explore
screen.tracer(False)
RULES = {'x':'x+yf+', 'y':'-fx-y', 'f':'f', '+':'+', '-':'-'}
sub_string = string = "fx"
LEVEL = 13
for _ in range(LEVEL):
turtle.pencolor(random(), random(), random())
for character in sub_string:
if character == '+':
turtle.right(90)
elif character == '-':
turtle.left(90)
elif character == 'f':
turtle.forward(5 * MAGNIFICATION)
screen.update()
full_string = "".join(RULES[character] for character in string)
sub_string = full_string[len(string):]
string = full_string
screen.tracer(True)
### Finished generating a landscape to explore
turtle.penup()
turtle.home()
turtle.setheading(90)
turtle.color('dark green', 'light green')
turtle.showturtle()
screen.onkey(move_left, "Left")
screen.onkey(move_right, "Right")
screen.onkey(move_up, "Up")
screen.onkey(move_down, "Down")
screen.listen()
screen.mainloop()
滚动条反映了整个 space 的移动。不幸的是,滚动条仍然处于活动状态并且会使东西歪斜(改用箭头键),并且它需要在景观边缘附近工作,但这只是一个示例,表明如果您花时间探索 tkinter/Tk 基础。