Hi, I've got some big problems with my program. I'm trying to learn how to use Python to create interactive programs with a GUI, but I'm having a really hard time even implementing a simple cursor scrolling around a screen. I think I have a little bit of an understanding of how to do this, but I'm getting all sorts of problems. Like, okay, I'm making just a square black cursor that moves around the screen, right? When it touches the edge of the screen, it should "crash" and be reset in the middle of the screen, sort of like a game piece colliding with a wall or something. But I can't ever reach the edge of the screen. I only get part way and then it breaks and starts over.

Another problem I'm having is that the square doesn't move the way I want it to. For example, when it's moving forward in any direction, the square gets squashed down. I don't really know how to describe it, but it gets shortened in the direction of motion for some reason. Otherwise I guess I figured out how to make it move and stop the way I want, so I don't think that any of the move commands need to be changed, but maybe they do to fix the problem. If you do need to fix them, please don't make it so the user can go backwards. So if the cursor is currently moving left, it can't just start going right. It needs to "turn" by either going up or down first. That's why I made the statements like "if cursor.direction != "down":" to check for turning behavior.

Here's the code I wrote, could you please help me figure it out?

# import modules
import turtle
import time

#Set tickrate
tick = 0.01

# Create a window
wn = turtle.Screen()
wn.title("Cursor Test")
wn.bgcolor("white")

# Set window size
window_width = 1000
window_height = 1000
wn.setup(window_width, window_height)
wn.tracer(0)


# Implement cursor
cursor = turtle.Turtle()
cursor.shape("square")
cursor.color("black")
cursor.penup()
cursor.goto(0, 0)
cursor.direction = "Stop"


# Implement inputs
def move_up():
	if cursor.direction != "down":
		cursor.direction = "up"
def move_down():
	if cursor.direction != "up":
		cursor.direction = "down"
def move_left():
	if cursor.direction != "right":
		cursor.direction = "left"
def move_right():
	if cursor.direction != "left":
		cursor.direction = "right"
def halt():
	cursor.direction = "Stop"


def move():
	if cursor.direction == "up":
		y = cursor.ycor()
		cursor.sety(y+10)
	if cursor.direction == "down":
		y = cursor.ycor()
		cursor.sety(y-10)
	if cursor.direction == "left":
		x = cursor.xcor()
		cursor.setx(x-10)
	if cursor.direction == "right":
		x = cursor.xcor()
		cursor.setx(x+10)

# Keyboard inputs
wn.listen()
wn.onkeypress(move_up, "w")
wn.onkeypress(move_down, "s")
wn.onkeypress(move_left, "a")
wn.onkeypress(move_right, "d")
wn.onkeypress(halt, "space")


# Scroll Cursor based on user inputs
while True:
	wn.update()
	if cursor.xcor() > 290 or cursor.xcor() < -290 or cursor.ycor() > 290 or cursor.ycor() < -290:
		time.sleep(1)
		cursor.goto(0, 0)
		cursor.direction = "Stop"
	move()
	time.sleep(tick)
wn.mainloop()
system
Olá, tenho alguns grandes problemas com o meu programa.Estou tentando aprender a usar o Python para criar programas interativos com uma GUI, mas estou tendo muito dificuldade em implementar um simples cursor rolando em torno de uma tela.Eu acho que tenho um pouco de uma compreensão de como fazer isso, mas estou recebendo todo tipo de problema.Tipo, ok, estou fazendo apenas um cursor preto quadrado que se move ao redor da tela, certo?Quando toca a borda da tela, ele deve "falhar" e ser redefinido no meio da tela, como uma peça de jogo colidindo com uma parede ou algo assim.Mas nunca posso chegar à borda da tela.Eu só fico parcial e então ele quebra e começa de novo.

Outro problema que estou tendo é que o quadrado não se move do jeito que eu quero.Por exemplo, quando está avançando em qualquer direção, o quadrado é esmagado.Eu realmente não sei como descrevê -lo, mas isso diminui na direção do movimento por algum motivo.Caso contrário, acho que descobri como fazê -lo se mover e parar do jeito que eu quero, então não acho que nenhum dos comandos de movimentação precise ser alterado, mas talvez eles façam para corrigir o problema.Se você precisar corrigi -los, não faça isso para que o usuário possa voltar para trás.Portanto, se o cursor estiver se movendo para a esquerda, ele não poderá começar a dar certo.Ele precisa "girar" subindo ou para baixo primeiro.É por isso que fiz as declarações como "se cursor.direction! =" Down ":" para verificar o comportamento de girar.

Aqui está o código que escrevi: você poderia me ajudar a descobrir?

# Módulos de importação
Importar tartaruga
tempo de importação

#Set Tickrate
tick = 0,01

# Crie uma janela
wn = tartaruga.screen ()
wn.title ("teste de cursor")
wn.bgcolor ("branco")

# Defina o tamanho da janela
window_width = 1000
Window_Height = 1000
wn.setup (window_width, window_height)
Wn.Tracer (0)


# Implementar cursor
cursor = Turtle.turtle ()
Cursor.Shape ("Square")
cursor.color ("preto")
cursor.penup ()
cursor.goto (0, 0)
cursor.direction = "Stop"


# Implemente entradas
def move_up ():
se cursor.direction! = "Down":
cursor.direction = "up"
def move_down ():
se cursor.direction! = "up":
cursor.direction = "Down"
def move_left ():
se cursor.direction! = "certo":
cursor.direction = "esquerda"
def move_right ():
se cursor.direction! = "esquerda":
cursor.direction = "Right"
Def Halt ():
cursor.direction = "Stop"


def move ():
se cursor.direction == "up":
y = cursor.ycor ()
cursor.sety (y+10)
Se cursor.direction == "Down":
y = cursor.ycor ()
cursor.sety (Y-10)
se cursor.direction == "esquerda":
x = cursor.xcor ()
cursor.setx (X-10)
Se cursor.direction == "Right":
x = cursor.xcor ()
cursor.setx (x+10)

# Entradas de teclado
wn.Listen ()
wn.onkeypress (move_up, "w")
wn.onkeypress (move_down, "s")
wn.onkeypress (move_left, "a")
wn.onkeypress (move_right, "d")
wn.onkeypress (HALT, "SPACE")


# Roll Cursor com base nas entradas do usuário
enquanto é verdade:
wn.update ()
se cursor.xcor ()> 290 ou cursor.xcor () <-290 ou cursor.ycor ()> 290 ou cursor.ycor () <-290:
time.sleep (1)
cursor.goto (0, 0)
cursor.direction = "Stop"
mover()
time.sleep (tick)
wn.mainloop ()
user
Revendo o código que você forneceu, vejo alguns problemas que podem estar causando o comportamento inesperado que você descreveu.

A primeira questão que você relatou, o cursor que não atinge a borda da janela está relacionado à incompatibilidade entre o tamanho da janela e a instrução IF que detecta a borda da janela.É possível que, em seus testes anteriores, você estivesse usando um tamanho de janela de 600 por 600 pixels, com base na implementação da detecção de arestas na instrução IF a seguir:

`` `Python
se cursor.xcor ()> 290 ou cursor.xcor () <-290 ou cursor.ycor ()> 290 ou cursor.ycor () <-290:
`` `
A maneira como essa linha de código funciona é que ele mede a distância que o cursor percorreu a origem 0,0, que é o centro da janela criado pelo seu código.Você pode corrigir esse problema alterando as dimensões da janela para uma altura e largura de 600 pixels, ou você pode modificar a instrução IF para tornar os limites em relação à janela.Aqui está uma maneira de implementar um limite relativo:

`` `Python
# Defina as bordas das janelas
esquerd_edge = 0 - (window_width / 2) + 10
Right_Edge = 0 + (Window_width / 2) - 10
top_edge = 0 + (Window_Height / 2) - 10
Bottom_Edge = 0 - (Window_Height / 2) + 10
`` `

Com essas quatro novas variáveis, que são baseadas no tamanho da janela, a instrução IF que monitora a posição do cursor para colisões de borda pode ser alterada para usar as variáveis.

`` `Python
se cursor.xcor ()> retire_edge ou cursor.xcor () <left_edge ou cursor.ycor ()> top_edge ou cursor.ycor () <bottom_edge:
`` `

A segunda edição que você relatou, o encurtamento inesperado do cursor na direção do movimento, provavelmente está relacionado a uma combinação da velocidade de movimento do cursor e da taxa de ticks do programa.A variável Tick determina a frequência com que a janela é atualizada.Atualmente, a variável Tick recebe um valor de 0,01, o que significa que a janela atualizaria 100 vezes por segundo.Isso pode causar comportamento inesperado, especialmente se a janela for vista em uma tela com uma taxa de atualização de 60 hertz.A taxa de carrapatos pode ser modificada com um valor maior, que pode resolver o problema de exibição que você descreveu.Definir o valor da variável Tick como 0,016 faria com que a janela atualize 60 vezes por segundo, o que pode resultar em melhor desempenho e evitar o artefato visual que você descreveu.Alterações adicionais na velocidade de movimento do cursor também podem ser úteis.O cursor está atualmente definido para uma velocidade de 10 unidades na direção atual da viagem.Abaixar esse valor pode tornar a aparência do movimento do cursor mais suave.

Abaixo está uma versão revisada do código que você compartilhou em sua solicitação, alterada para incorporar a detecção relativa de colisão da borda da tela e uma taxa de carrapato mais baixa.


`` `Python
# Módulos de importação
Importar tartaruga
tempo de importação

# Definir taxa de tick
tick = 0,016

# Crie uma janela
wn = tartaruga.screen ()
wn.title ("teste de cursor")
wn.bgcolor ("branco")

# Defina o tamanho da janela
window_width = 1000
Window_Height = 1000
wn.setup (window_width, window_height)
Wn.Tracer (0)

# Defina as bordas das janelas
esquerd_edge = 0 - (window_width / 2) + 10
Right_Edge = 0 + (Window_width / 2) - 10
top_edge = 0 + (Window_Height / 2) - 10
Bottom_Edge = 0 - (Window_Height / 2) + 10

# Implementar cursor
cursor = Turtle.turtle ()
Cursor.Shape ("Square")
cursor.color ("preto")
cursor.penup ()
cursor.goto (0, 0)
cursor.direction = "Stop"

# Implemente entradas
def move_up ():
    se cursor.direction! = "Down":
        cursor.direction = "up"
def move_down ():
    se cursor.direction! = "up":
        cursor.direction = "Down"
def move_left ():
    se cursor.direction! = "certo":
        cursor.direction = "esquerda"
def move_right ():
    se cursor.direction! = "esquerda":
        cursor.direction = "Right"
Def Halt ():
    cursor.direction = "Stop"

def move ():
    se cursor.direction == "up":
        y = cursor.ycor ()
        cursor.sety (y + 10)
    Se cursor.direction == "Down":
        y = cursor.ycor ()
        cursor.sety (y - 10)
    se cursor.direction == "esquerda":
        x = cursor.xcor ()
        cursor.setx (x - 10)
    Se cursor.direction == "Right":
        x = cursor.xcor ()
        cursor.setx (x + 10)

# Entradas de teclado
wn.Listen ()
wn.onkeypress (move_up, "w")
wn.onkeypress (move_down, "s")
wn.onkeypress (move_left, "a")
wn.onkeypress (move_right, "d")
wn.onkeypress (HALT, "SPACE")

# Roll Cursor com base nas entradas do usuário
enquanto é verdade:
    wn.update ()
    se cursor.xcor ()> retire_edge ou cursor.xcor () <left_edge ou cursor.ycor ()> top_edge ou cursor.ycor () <bottom_edge:
        time.sleep (1)
        cursor.goto (0, 0)
        cursor.direction = "Stop"
    mover()
    time.sleep (tick)

wn.mainloop ()
`` `
assistant
<|system|>
</s>
<|user|>
Olá, tenho alguns grandes problemas com o meu programa.Estou tentando aprender a usar o Python para criar programas interativos com uma GUI, mas estou tendo muito dificuldade em implementar um simples cursor rolando em torno de uma tela.Eu acho que tenho um pouco de uma compreensão de como fazer isso, mas estou recebendo todo tipo de problema.Tipo, ok, estou fazendo apenas um cursor preto quadrado que se move ao redor da tela, certo?Quando toca a borda da tela, ele deve "falhar" e ser redefinido no meio da tela, como uma peça de jogo colidindo com uma parede ou algo assim.Mas nunca posso chegar à borda da tela.Eu só fico parcial e então ele quebra e começa de novo.

Outro problema que estou tendo é que o quadrado não se move do jeito que eu quero.Por exemplo, quando está avançando em qualquer direção, o quadrado é esmagado.Eu realmente não sei como descrevê -lo, mas isso diminui na direção do movimento por algum motivo.Caso contrário, acho que descobri como fazê -lo se mover e parar do jeito que eu quero, então não acho que nenhum dos comandos de movimentação precise ser alterado, mas talvez eles façam para corrigir o problema.Se você precisar corrigi -los, não faça isso para que o usuário possa voltar para trás.Portanto, se o cursor estiver se movendo para a esquerda, ele não poderá começar a dar certo.Ele precisa "girar" subindo ou para baixo primeiro.É por isso que fiz as declarações como "se cursor.direction! =" Down ":" para verificar o comportamento de girar.

Aqui está o código que escrevi: você poderia me ajudar a descobrir?

# Módulos de importação
Importar tartaruga
tempo de importação

#Set Tickrate
tick = 0,01

# Crie uma janela
wn = tartaruga.screen ()
wn.title ("teste de cursor")
wn.bgcolor ("branco")

# Defina o tamanho da janela
window_width = 1000
Window_Height = 1000
wn.setup (window_width, window_height)
Wn.Tracer (0)


# Implementar cursor
cursor = Turtle.turtle ()
Cursor.Shape ("Square")
cursor.color ("preto")
cursor.penup ()
cursor.goto (0, 0)
cursor.direction = "Stop"


# Implemente entradas
def move_up ():
se cursor.direction! = "Down":
cursor.direction = "up"
def move_down ():
se cursor.direction! = "up":
cursor.direction = "Down"
def move_left ():
se cursor.direction! = "certo":
cursor.direction = "esquerda"
def move_right ():
se cursor.direction! = "esquerda":
cursor.direction = "Right"
Def Halt ():
cursor.direction = "Stop"


def move ():
se cursor.direction == "up":
y = cursor.ycor ()
cursor.sety (y+10)
Se cursor.direction == "Down":
y = cursor.ycor ()
cursor.sety (Y-10)
se cursor.direction == "esquerda":
x = cursor.xcor ()
cursor.setx (X-10)
Se cursor.direction == "Right":
x = cursor.xcor ()
cursor.setx (x+10)

# Entradas de teclado
wn.Listen ()
wn.onkeypress (move_up, "w")
wn.onkeypress (move_down, "s")
wn.onkeypress (move_left, "a")
wn.onkeypress (move_right, "d")
wn.onkeypress (HALT, "SPACE")


# Roll Cursor com base nas entradas do usuário
enquanto é verdade:
wn.update ()
se cursor.xcor ()> 290 ou cursor.xcor () <-290 ou cursor.ycor ()> 290 ou cursor.ycor () <-290:
time.sleep (1)
cursor.goto (0, 0)
cursor.direction = "Stop"
mover()
time.sleep (tick)
wn.mainloop ()</s>
<|assistant|>
Revendo o código que você forneceu, vejo alguns problemas que podem estar causando o comportamento inesperado que você descreveu.

A primeira questão que você relatou, o cursor que não atinge a borda da janela está relacionado à incompatibilidade entre o tamanho da janela e a instrução IF que detecta a borda da janela.É possível que, em seus testes anteriores, você estivesse usando um tamanho de janela de 600 por 600 pixels, com base na implementação da detecção de arestas na instrução IF a seguir:

`` `Python
se cursor.xcor ()> 290 ou cursor.xcor () <-290 ou cursor.ycor ()> 290 ou cursor.ycor () <-290:
`` `
A maneira como essa linha de código funciona é que ele mede a distância que o cursor percorreu a origem 0,0, que é o centro da janela criado pelo seu código.Você pode corrigir esse problema alterando as dimensões da janela para uma altura e largura de 600 pixels, ou você pode modificar a instrução IF para tornar os limites em relação à janela.Aqui está uma maneira de implementar um limite relativo:

`` `Python
# Defina as bordas das janelas
esquerd_edge = 0 - (window_width / 2) + 10
Right_Edge = 0 + (Window_width / 2) - 10
top_edge = 0 + (Window_Height / 2) - 10
Bottom_Edge = 0 - (Window_Height / 2) + 10
`` `

Com essas quatro novas variáveis, que são baseadas no tamanho da janela, a instrução IF que monitora a posição do cursor para colisões de borda pode ser alterada para usar as variáveis.

`` `Python
se cursor.xcor ()> retire_edge ou cursor.xcor () <left_edge ou cursor.ycor ()> top_edge ou cursor.ycor () <bottom_edge:
`` `

A segunda edição que você relatou, o encurtamento inesperado do cursor na direção do movimento, provavelmente está relacionado a uma combinação da velocidade de movimento do cursor e da taxa de ticks do programa.A variável Tick determina a frequência com que a janela é atualizada.Atualmente, a variável Tick recebe um valor de 0,01, o que significa que a janela atualizaria 100 vezes por segundo.Isso pode causar comportamento inesperado, especialmente se a janela for vista em uma tela com uma taxa de atualização de 60 hertz.A taxa de carrapatos pode ser modificada com um valor maior, que pode resolver o problema de exibição que você descreveu.Definir o valor da variável Tick como 0,016 faria com que a janela atualize 60 vezes por segundo, o que pode resultar em melhor desempenho e evitar o artefato visual que você descreveu.Alterações adicionais na velocidade de movimento do cursor também podem ser úteis.O cursor está atualmente definido para uma velocidade de 10 unidades na direção atual da viagem.Abaixar esse valor pode tornar a aparência do movimento do cursor mais suave.

Abaixo está uma versão revisada do código que você compartilhou em sua solicitação, alterada para incorporar a detecção relativa de colisão da borda da tela e uma taxa de carrapato mais baixa.


`` `Python
# Módulos de importação
Importar tartaruga
tempo de importação

# Definir taxa de tick
tick = 0,016

# Crie uma janela
wn = tartaruga.screen ()
wn.title ("teste de cursor")
wn.bgcolor ("branco")

# Defina o tamanho da janela
window_width = 1000
Window_Height = 1000
wn.setup (window_width, window_height)
Wn.Tracer (0)

# Defina as bordas das janelas
esquerd_edge = 0 - (window_width / 2) + 10
Right_Edge = 0 + (Window_width / 2) - 10
top_edge = 0 + (Window_Height / 2) - 10
Bottom_Edge = 0 - (Window_Height / 2) + 10

# Implementar cursor
cursor = Turtle.turtle ()
Cursor.Shape ("Square")
cursor.color ("preto")
cursor.penup ()
cursor.goto (0, 0)
cursor.direction = "Stop"

# Implemente entradas
def move_up ():
    se cursor.direction! = "Down":
        cursor.direction = "up"
def move_down ():
    se cursor.direction! = "up":
        cursor.direction = "Down"
def move_left ():
    se cursor.direction! = "certo":
        cursor.direction = "esquerda"
def move_right ():
    se cursor.direction! = "esquerda":
        cursor.direction = "Right"
Def Halt ():
    cursor.direction = "Stop"

def move ():
    se cursor.direction == "up":
        y = cursor.ycor ()
        cursor.sety (y + 10)
    Se cursor.direction == "Down":
        y = cursor.ycor ()
        cursor.sety (y - 10)
    se cursor.direction == "esquerda":
        x = cursor.xcor ()
        cursor.setx (x - 10)
    Se cursor.direction == "Right":
        x = cursor.xcor ()
        cursor.setx (x + 10)

# Entradas de teclado
wn.Listen ()
wn.onkeypress (move_up, "w")
wn.onkeypress (move_down, "s")
wn.onkeypress (move_left, "a")
wn.onkeypress (move_right, "d")
wn.onkeypress (HALT, "SPACE")

# Roll Cursor com base nas entradas do usuário
enquanto é verdade:
    wn.update ()
    se cursor.xcor ()> retire_edge ou cursor.xcor () <left_edge ou cursor.ycor ()> top_edge ou cursor.ycor () <bottom_edge:
        time.sleep (1)
        cursor.goto (0, 0)
        cursor.direction = "Stop"
    mover()
    time.sleep (tick)

wn.mainloop ()
`` `</s>
