Canvas begrenzen

Fragen zu Tkinter.
Antworten
BjBer24
User
Beiträge: 2
Registriert: Dienstag 1. Juni 2010, 15:42

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
Zuletzt geändert von Leonidas am Dienstag 1. Juni 2010, 17:20, insgesamt 1-mal geändert.
Grund: Thema verschoben
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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
BjBer24
User
Beiträge: 2
Registriert: Dienstag 1. Juni 2010, 15:42

Danke Frank schön aber gibt es auch eine möglichkeit mit "return"?
einfach mal so zum wissen :oops:
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.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Antworten