Seite 1 von 1

Canvas begrenzen

Verfasst: Dienstag 1. Juni 2010, 15:54
von BjBer24
Ich habe ein kleines Problem ich würde gerne ein canvas feld für ein objekt begrenzen.Der Balken in dem fall soll nicht nach links aus dem canvas gehen dürfen und der balken wird mit der linken Pfeiltaste bewegt.
Das Fenster ist hier bekannt und ich habe auch schon bei den defs versucht das mit einer if- Bedingung und return zu machen.

Code: Alles auswählen

from Tkinter import *
farbe="yellow"
def bewegeLinks(event):
    bewegeBall1()


def bewegeBall():
    if ball(60,220,2,240):
        return ball(60,220,2,240)
    else:
        linie.move(ball,-5,0)
    linie.update()


root=Tk()
frmRahmen1=Frame()
frmRahmen1.grid(row=1,column=1)
linie=Canvas(frmRahmen1,width=280,height=240,bg="red")
linie.grid()
ball=linie.create_rectangle(60,220,2,240,fill=farbe)
root.bind("<Left>",bewegeLinks)
root.mainloop()
Ps.: Bin noch nen Anfänger also einfach erklären :oops:

Greetz un Danke im vorraus

Re: Canvas begrenzen

Verfasst: Dienstag 1. Juni 2010, 21:55
von kaytec
Hallo BjBer 24 !

Mit "bbox" kannst du die Position von Objekten auf dem Feld ("Canvas") auslesen. Die Grenzwerte habe ich ausprobiert - sollten aber nicht so im Code liegen, sondern vorher festgelegt sein und du zeichnest das Feld nach dieser Größe.

Code: Alles auswählen

import Tkinter as tk
from functools import partial

farbe="yellow"

def bewegeBall(step, event):
    if (field.bbox("ball")[0] + step > -2 
            and field.bbox("ball")[0] + step < 260):
        field.move(ball,step ,0)

root=tk.Tk()
field=tk.Canvas(root,width=280,height=240,bg="red")
field.pack()
ball=field.create_oval(10,220,30,240,fill=farbe, tag="ball")
root.bind("<Left>",partial(bewegeBall, -5))
root.bind("<Right>",partial(bewegeBall, 5))
root.resizable(0, 0)
root.mainloop()
Gruß Frank

Re: Canvas begrenzen

Verfasst: Mittwoch 2. Juni 2010, 19:54
von BjBer24
Danke Frank schön aber gibt es auch eine möglichkeit mit "return"?
einfach mal so zum wissen :oops:

Re: Canvas begrenzen

Verfasst: Mittwoch 2. Juni 2010, 20:37
von BlackJack
@BjBer24: Was meinst Du damit? Das ``return`` in Deinem Code ist vom Sinn her jedenfalls ziemlich daneben. Damit wird ein Wert zurückgegeben und damit sollte man beim Aufrufer dann auch etwas machen. Ausserdem sollte eine Funktion über alle möglichen Ausgangspunkte wenn es geht einen Wert vom selben Typ zurückgeben.

Re: Canvas begrenzen

Verfasst: Donnerstag 3. Juni 2010, 07:33
von wuf
Hallo BjBer24

Hier noch eine Variante in alle Richtungen:

Code: Alles auswählen

# wuf_ref: canvas_limited_01_01.py

import Tkinter as tk

#~~ Eigenschaften fuer das Spielfeld
PLANE_WIDTH = 280
PLANE_HEIGHT = 240
PLANE_COLOR = 'red'

#~~ Eigenschaften fuer den Spielball
BALL_SIZE = 40
BALL_COLOR = "yellow"
BALL_STEP = 5

def move_ball(event):

    x0, y0, x1, y1 = plane.bbox(ball)

    xadj, yadj, lim = {
        'Up'   :(0, -BALL_STEP, y0),
        'Down' :(0, BALL_STEP, PLANE_HEIGHT-y1),
        'Left' :(-BALL_STEP, 0, x0),
        'Right':(BALL_STEP, 0, PLANE_WIDTH-x1)
        }.get(event.keysym,(0, 0, -1))

    if lim >= 0:
        plane.move(ball, xadj, yadj)

#~~ Erstelle das Hauptfenster
root=tk.Tk()
root.bind("<KeyPress>", move_ball)
root.title("Move the Ball")

#~~ Erstelle die Spielflaeche
plane = tk.Canvas(root, width=PLANE_WIDTH, height=PLANE_HEIGHT,
    bg=PLANE_COLOR, highlightthickness=0)
plane.grid()

#~~ Erstelle das Ball Grafikobjekt
ball = plane.create_oval(0, 0, BALL_SIZE, BALL_SIZE, fill=BALL_COLOR)

#~~ Platziere den Ball auf die Startposition
plane.move(ball, 10, 10)

root.mainloop()
Gruß wuf :wink: