2017-01-21 2 views
0

In Python mache ich gerade ein "Spiel" mit tkinter, aber es hat sich entschieden, nicht zu arbeiten. Was ich versuche, ist ein Rechteck, das mit der Maus bewegt werden kann, und das andere Rechteck, das sich kontinuierlich nach oben und unten bewegt, ohne dass der Spieler etwas tut. Hier ist mein Code:Automatisch bewegte Form? Python 3.5 Tkinter

from tkinter import * 
import time 
root = Tk() 
root.title("Game") 
root.geometry("800x800") 

def motion(): 
    canvas.delete(ALL) 
    a = canvas.create_rectangle(event.x-50, event.y-50, event.x+50, event.y+50, fill='red') 

def motion2(): 
    b = canvas.create_rectangle(10, 100, 100, 10, fill='blue') 
    y = -15 
    x = 0 
    time.sleep(0.025) 
    canvas.move(b, x, -y) 
    canvas.update() 

canvas = Canvas(root, width=1000, height=5000, bg='white') 
canvas.bind("<Motion>", motion) 
canvas.pack(pady=0) 

mainloop() 

Ich hoffe, dass dies bald gelöst werden kann. Ich arbeite seit einigen Tagen daran, immer noch keine Antwort. Danke für Ihre Zeit :) -Jake

+1

Verwendung 'root.after (Millisekunden, function_name)' Objekt automatisch zu bewegen - und entfernen 'time.sleep()'. – furas

+1

um Objekte zu verschieben, müssen Sie das Objekt nicht löschen und neu erstellen - Sie haben 'canvas.coords (object_id, ...)' und 'canvas.move (object_id, ...)'. Bessere Dokumentation lesen: dh. http://effbot.org/tkinterbook/canvas.htm – furas

Antwort

1

Sie können root.after(milliseconds, function_name) verwenden, um Funktion regelmäßig auszuführen, und es kann canvas.move(object_id, offset_x, offset_y) verwenden, um Objekt automatisch zu verschieben.

Und Sie können canvas.coords(object_id, x1, y1, x2, y2) verwenden, um neue Position mithilfe der Mausposition festzulegen. bind führt Funktion mit einem Argument (Objekt event) aus, so dass Funktion dieses Argument erhalten muss.

import tkinter as tk 

# --- functions --- 

def move_a(event): 
    canvas.coords(a, event.x-50, event.y-50, event.x+50, event.y+50) 

def move_b(): 
    canvas.move(b, 1, 0) 
    # move again after 25ms (0.025s) 
    root.after(25, move_b) 

# --- main --- 

# init 
root = tk.Tk() 

# create canvas 
canvas = tk.Canvas(root) 
canvas.pack() 

# create objects 
a = canvas.create_rectangle(0, 0, 100, 100, fill='red') 
b = canvas.create_rectangle(0, 0, 100, 100, fill='blue') 

# start moving `a` with mouse 
canvas.bind("<Motion>", move_a) 

# start moving `b` automatically 
move_b() 

# start program 
root.mainloop() 

EDIT: nach oben und unten haben Sie Variable verwenden, um mit speed so können Sie es speed--speed und Againt zu speed ändern. Und Sie können auch move_down = True/False verwenden Stromrichtung zu überprüfen (oder Sie können speed verwenden Richtung zu überprüfen, aber b_move_down können besser lesbar für Menschen sein)

import tkinter as tk 

# --- functions --- 

def move_a(event): 
    canvas.coords(a, event.x-50, event.y-50, event.x+50, event.y+50) 

def move_b(): 
    # inform function to use external/global variable 
    # because we use `=` to change its value 
    global b_speed 
    global b_move_down 

    canvas.move(b, 0, b_speed) 

    # get current position   
    x1, y1, x2, y2 = canvas.coords(b) 

    # check if you have to change direction 
    #if b_speed > 0: 
    if b_move_down: 
     # if it reachs bottom 
     if y2 > 300: 
      # change direction 
      #b_move_down = False 
      b_move_down = not b_move_down 
      b_speed = -b_speed 
    else: 
     # if it reachs top 
     if y1 < 0: 
      # change direction 
      #b_move_down = True 
      b_move_down = not b_move_down 
      b_speed = -b_speed 

    # move again after 25 ms (0.025s) 
    root.after(25, move_b) 

# --- main --- 

# init 
root = tk.Tk() 

# create canvas 
canvas = tk.Canvas(root, width=500, height=300) 
canvas.pack() 

# create objects 
a = canvas.create_rectangle(0, 0, 100, 100, fill='red') 
b = canvas.create_rectangle(0, 0, 100, 100, fill='blue') 
# create global variables 
b_move_down = True 
b_speed = 5 

# start moving `a` with mouse 
canvas.bind("<Motion>", move_a) 

# start moving `b` automatically 
move_b() 

# start program 
root.mainloop() 

EDIT: bewegen sich die Leinwand

import tkinter as tk 

# --- functions --- 

def move_a(event): 
    canvas.coords(a, event.x-50, event.y-50, event.x+50, event.y+50) 

def move_b(): 
    # inform function to use external/global variable 
    # because we use `=` to change its value 
    global b_speed_x 
    global b_speed_y 
    global b_direction 

    canvas.move(b, b_speed_x, b_speed_y) 

    # get current position   
    x1, y1, x2, y2 = canvas.coords(b) 

    if b_direction == 'down': 
     if y2 >= 300: 
      b_direction = 'right' 
      b_speed_x = 5 
      b_speed_y = 0 
    elif b_direction == 'up': 
     if y1 <= 0: 
      b_direction = 'left' 
      b_speed_x = -5 
      b_speed_y = 0 
    elif b_direction == 'right': 
     if x2 >= 500: 
      b_direction = 'up' 
      b_speed_x = 0 
      b_speed_y = -5 
    elif b_direction == 'left': 
     if x1 <= 0: 
      b_direction = 'down' 
      b_speed_x = 0 
      b_speed_y = 5 

    # move again after 25 ms (0.025s) 
    root.after(25, move_b) 

# --- main --- 

# init 
root = tk.Tk() 

# create canvas 
canvas = tk.Canvas(root, width=500, height=300) 
canvas.pack() 

# create objects 
a = canvas.create_rectangle(0, 0, 100, 100, fill='red') 
b = canvas.create_rectangle(0, 0, 100, 100, fill='blue') 
# create global variables 
b_direction = 'down' 
b_speed_x = 0 
b_speed_y = 5 

# start moving `a` with mouse 
canvas.bind("<Motion>", move_a) 

# start moving `b` automatically 
move_b() 

# start program 
root.mainloop() 

EDIT: letzte Beispiel - k ey p Pausen Spiel

#!/usr/bin/env python3 

import tkinter as tk 

# --- constants --- (UPPER_CASE names) 

DISPLAY_WIDHT = 800 
DISPLAY_HEIGHT = 600 

# --- classes --- (CamelCase names) 

#class Player(): 
# pass 

#class BlueEnemy(): 
# pass 

# --- functions --- (lower_case names) 

def move_a(event): 
    # don't move if gama paused 
    if not game_paused: 
     canvas.coords(a, event.x-50, event.y-50, event.x+50, event.y+50) 

def move_b(): 
    # inform function to use external/global variable 
    # because we use `=` to change its value 
    global b_speed_x 
    global b_speed_y 
    global b_direction 

    # don't move if gama paused 
    if not game_paused: 
     canvas.move(b, b_speed_x, b_speed_y) 

     # get current position 
     x1, y1, x2, y2 = canvas.coords(b) 

     if b_direction == 'down': 
      if y2 >= DISPLAY_HEIGHT: 
       b_direction = 'right' 
       b_speed_x = 5 
       b_speed_y = 0 
     elif b_direction == 'up': 
      if y1 <= 0: 
       b_direction = 'left' 
       b_speed_x = -5 
       b_speed_y = 0 
     elif b_direction == 'right': 
      if x2 >= DISPLAY_WIDHT: 
       b_direction = 'up' 
       b_speed_x = 0 
       b_speed_y = -5 
     elif b_direction == 'left': 
      if x1 <= 0: 
       b_direction = 'down' 
       b_speed_x = 0 
       b_speed_y = 5 

    # move again after 25 ms (0.025s) 
    root.after(25, move_b) 

def pause(event): 
    global game_paused 

    # change True/False 
    game_paused = not game_paused 

    if game_paused: 
     # center text on canvas 
     canvas.coords(text_pause, DISPLAY_WIDHT//2, DISPLAY_HEIGHT//2) 
    else: 
     # move text somewhere outside canvas 
     canvas.coords(text_pause, -1000, -1000) 

# --- main --- (lower_case names) 

# init 
root = tk.Tk() 

# key `p` pause game 
game_paused = False 
root.bind('p', pause) 

# create canvas 
canvas = tk.Canvas(root, width=DISPLAY_WIDHT, height=DISPLAY_HEIGHT) 
canvas.pack() 

# create objects 
a = canvas.create_rectangle(0, 0, 100, 100, fill='red') 
b = canvas.create_rectangle(0, 0, 100, 100, fill='blue') 
# create global variables 
b_direction = 'down' 
b_speed_x = 0 
b_speed_y = 5 

# start moving `a` with mouse 
canvas.bind("<Motion>", move_a) 

# start moving `b` automatically 
move_b() 

# create text somewhere outside canvas - so it will be "invisible" 
text_pause = canvas.create_text(-1000, -1000, text="PAUSED", font=(50,)) 

# start program 
root.mainloop() 
+0

Ich meine, indem ich es kontinuierlich nach oben und unten bewegt, was bedeutet, dass es nie aufhört, es zu tun. Danke für die Antwort. – Jake

+0

Um es zu stoppen oder die Richtung zu ändern, müssen Sie Variablen wie 'move_up = True' und etwas 'if/else' verwenden, um zu überprüfen, wann die Richtung geändert werden soll. – furas

+0

Wie mache ich das kontinuierlich? – Jake