events in TKinter

Fragen zu Tkinter.
Antworten
Freakman
User
Beiträge: 8
Registriert: Dienstag 28. Februar 2006, 11:38
Kontaktdaten:

Donnerstag 2. März 2006, 15:06

also ich wollte ja ein alleway clon proggen stolpere nur über das prob das ich unten den balken net bewegen kann. hat vll jmd ne idee?? wollte dsa eigentlich unten mit den linken und rehcten mousebutton als event gestaten.... bin aber irgendwie net in der lage das zu machen o0
(und ja ich bin ein noob xD)

Code: Alles auswählen

import Tkinter
import Canvas
import random

# ----------------------------------------------------------
# Funktionen
# ----------------------------------------------------------
def rechteck(fill='blue'):
    blatt.create_rectangle(200,580,350,590,fill='blue')

def line(x0,y0,x1,y1):
    blatt.create_line(x0,y0,x1,y1,fill='#000',width=1)

def line1(x0,y0,x1,y1):
     blatt.create_line(x0,y0,x1,y1,fill='#FF0000',width=1)

def text(x,y,s):
    blatt.create_text(x,y,text=s, anchor= 'nw')

def kreis(x,y,r):
    blatt.create_oval(x-r,y-r,x+r,y+r)

def punkt(x,y):
    blatt.create_oval(x-2,y-2,x+4,y+4, fill='#FFFF00')

def animation(event):
    global dx 
    global dy
    
    xm=100
    ym=200
    r=10
    
    ball=Canvas.Oval(blatt,(xm-r,ym-r),(xm+r,ym+r),fill='red') 
    
   
    while 1:
       xm =xm + dx
       ym= ym +dy
       
       if xm > 590 or xm< 10 :
          dx = -dx
    
       elif ym < 10 or ym > 590 :
            dy = -dy
       
       elif ym<20  and xm>200 and xm> 300: 
            rechteck.delete()
	    rechteck(fill='green')
       
       ball.delete()       
       ball= Canvas.Oval(blatt,(xm-r,ym-r),(xm+r,ym+r),fill='red')       
       blatt.update()
       blatt.after(50)   

       
def links(event):
    rechteck.delete()
    blatt.create_rectangle(205,580,355,590,fill='blue') # erster versuch xD
    


#def rechts(event):
 

# ----------------------------------------------------------
# main
# ----------------------------------------------------------




# Fenster einrichten
hoehe  = 600,
breite = 600
rahmen = Tkinter.Tk()
blatt  = Tkinter.Canvas(rahmen,height=hoehe,width=breite,background='#fff')
blatt.pack()
#animation mit der maus
s= 'Die Animation wird mit der mittleren Maustaste gestartet'

text(10,20,s)
dx=2
dy=3


rechteck()
blatt.bind('<ButtonPress-2>',animation)
blatt.bind('<ButtonPress-1>',links)
#blatt.bind('<ButtonPress-3>',rechts)

#fenster schließen

rahmen.mainloop()
jochim
User
Beiträge: 32
Registriert: Montag 5. August 2002, 20:47
Wohnort: Dortmund

Donnerstag 2. März 2006, 21:28

der Befehl zum Bewegen eines Canvas Objektes ist "canvas.move(item,dx,dy)".
Dabei ist 'item' das zu bewegende Objekt, 'dx' die Verschiebung in X Richtung und 'dy' entsprechend in Y Richtung.

Gruß
Jochim
Freakman
User
Beiträge: 8
Registriert: Dienstag 28. Februar 2006, 11:38
Kontaktdaten:

Freitag 3. März 2006, 10:31

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "D:\Python\lib\lib-tk\Tkinter.py", line 1345, in __call__
    return self.func(*args)
  File "C:\anima.py", line 62, in links
    Canvas.move(rechteck,50,0)
AttributeError: 'module' object has no attribute 'move'
mach ich was falsch ?? oder kennt mein TKinter den befehl move net o0 ich versteh es net....
BlackJack

Samstag 4. März 2006, 00:23

Du hast versucht die Funktion `move()` im `Canvas` Modul von `Tkinter` aufzurufen. So eine Funktion gibt es aber nicht. Du musst die `move()` Methode auf Deinem `blatt` benutzen.
Freakman
User
Beiträge: 8
Registriert: Dienstag 28. Februar 2006, 11:38
Kontaktdaten:

Sonntag 5. März 2006, 11:45

hmm kann mir jmd mal ein bsp zeigen... ich raff das irgendwie immer nncoh net bzw bekomm es net gebacken.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Sonntag 5. März 2006, 11:50

Hi!

Code: Alles auswählen

from Tkinter import *
import time

root = Tk()

c = Canvas()
c.pack()

c.create_oval(10,10,20,20,fill="blue", tag="ball")

for i in range(10):
    c.move("ball", 5,5)
    root.update()
    time.sleep(0.5)

root.mainloop()
Gruß, mawe
Freakman
User
Beiträge: 8
Registriert: Dienstag 28. Februar 2006, 11:38
Kontaktdaten:

Sonntag 5. März 2006, 17:59

einen ball zum laufen brinegn ist net das ding...

das ding ist nur ein objekt mit hilfe eines tastendrucks zu bewegen 8zB das wenn amn die linke masutaste drückt das rechteck nach links bewegt wird)
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Sonntag 5. März 2006, 18:30

"Das Ding", weswegen ich Dir das Snippet gepostet habe, war, zu zeigen wie man move verwendet. Ob das jetzt mit Tastendruck oder ohne passiert ändert ja nichts daran. Wie man einen Tastendruck verwertet weisst Du doch eh schon.
Freakman
User
Beiträge: 8
Registriert: Dienstag 28. Februar 2006, 11:38
Kontaktdaten:

Montag 6. März 2006, 13:40

joa stimmt hast du gemacht o0 (war etwas gefrustet sry)

ich bekomms trotz net hin wofür packste das ganze in ne for schleife ?
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Montag 6. März 2006, 17:04

Freakman hat geschrieben: war etwas gefrustet sry
Kein Problem :)
Freakman hat geschrieben: wofür packste das ganze in ne for schleife ?
Naja, ich lass den Ball eben 10 "Sprünge" machen, daher die Schleife. Einen würde man nicht so gut sehen (als Demonstration) finde ich ;)

Hier noch ein kleines Snippet ohne Schleife. Der Ball bewegt sich wenn Du mit der linken Maustaste in das Fenster klickst:

Code: Alles auswählen

from Tkinter import *

def move_it(event):
    # Ball bewegt sich 5 Pixel in x und 5 Pixel in y Richtung (also nach rechts unten)
    c.move("ball", 5, 5)

root = Tk()

c = Canvas()
c.pack()

c.create_oval(10,10,20,20, fill="blue", tag="ball")

c.bind("<1>", move_it)

root.mainloop()
Freakman
User
Beiträge: 8
Registriert: Dienstag 28. Februar 2006, 11:38
Kontaktdaten:

Dienstag 7. März 2006, 16:18

Code: Alles auswählen

def links(event):
    r1=200 #hab gedacht erzeugste das rechteck lieber beim ersten klick 
    r2=580
    r3=350
    r4=590
    rechteck(r1,r2,r3,r4)
    
    blatt.move("rechteck", 5,0) 
´


hab das obere progg so verändert hab das schon 2 tage oder so.... aber es bewegt sich nur der ball ... nach wie vor ... bekomm aber keine fehlermeldung. alos syntax ist richtig und normal auch... baer es geht net weiß wer warum ?
BlackJack

Dienstag 7. März 2006, 22:03

Ja das weiss ich glaube ich. Aber vielleicht kommst Du ja selbst drauf. Was genau passiert denn *jedesmal* wenn Du klickst und die `links()` Funktion abgearbeitet wird.
Freakman
User
Beiträge: 8
Registriert: Dienstag 28. Februar 2006, 11:38
Kontaktdaten:

Mittwoch 8. März 2006, 08:07

ja das erchteck wird wieder neu konstruiert..... aber wenn ich das oben in den event für die mittlere maustatse schreibe, funktioniert das "moven" immer noch net.


es klappt juhhhuuu es klappt ^^

wo lag der fehler o0 im create befehl fehlte hinten

Code: Alles auswählen

tag = 'rechteck'
hätt mit ja ruhig mal einer sagen können :oops:
Antworten