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
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

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
