Mit Xturtle/Canvas einen Button malen

Fragen zu Tkinter.
Antworten
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Freitag 31. Oktober 2008, 20:22

Hallo

Wenn ich mit Xturtle eine Haus male und es dann Fülle erkennt ja xturtle das Haus ja als "objekt", meine frage nun kann ich das Haus auch als Button benützen?

Gruß
Andyh
Zuletzt geändert von Andyh am Samstag 1. November 2008, 13:34, insgesamt 1-mal geändert.
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 31. Oktober 2008, 20:37

Ja und nein.

Wenn du das Haus als Turtle-Shape verwendest bzw. verwenden kannst (als Polygon oder aus Polygonen zusammengesetzt oder als Gif-Datei), dann ja. Über die onclick() Methode einer Turtle kannst du einen Mausklick-Event verarbeiten.

Wenn du das Haus einfach nur gezeichnet hast - auch wenn es gefüllt wurde - dann kannst du es nicht als Objekt an ein Ereignis binden. Die Lösung sähe dann so aus, dass du bei einem Mausklick die Koordinaten der Maus abfragst und prüfst, ob diese innerhalb des Hauses liegen.

Evtl. lohnt sich ein Blick auf die xturtle-Alternative frog. Damit kannst du zwar ein gezeichnetes Haus auch nicht zum Objekt machen, aber die Frösche (= Turtles) haben eine Methode button(text,command), mit denen sich echte Buttons im Fenster erzeugen lassen - das geht mit xturtle nicht.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Freitag 31. Oktober 2008, 20:47

Hallo

Besten Dank!!!

Hat jemand ein Beispiel, kann mir noch nicht so viel vorstellen.

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 31. Oktober 2008, 20:48

Andyh hat geschrieben:Hat jemand ein Beispiel, kann mir noch nicht so viel vorstellen.
Beispiel für was genau?
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Freitag 31. Oktober 2008, 21:14

Hallo

Allgemein wie ich das mit Turtle-Shape mache.

Ein einfachses rechet oder so auf das man klicken kann und dann wie die Methode "test1" aufgerufen.

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 31. Oktober 2008, 22:44

Wie wär's mit Doku lesen?

Zu xturtle gibt es ein Buch "Python für Kids" - das ist eigentlich das Tutorial zum Modul.

Zu frog gibt es eine dt. Doku mit dem Modul.

Da steht zum einen drin, wie man eine Turtle- bzw. Frog-Shape definiert und auch wie man das mit dem Mausklick macht.
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

Freitag 31. Oktober 2008, 22:56

Hallo

mal schaun ob ich das hin bekomme

Erzeugen benutzerdefinierter Turtle-Shapes

Code: Alles auswählen

begin_poly() #Start der Aufzeichnung
fd(20)
lt(90)
fd(40)
lt(90)
fd(20)
lt(90)
fd(40) #zeichnet die neue Turtle-Shape
end_poly() #Ende der Aufzeichnung
re = get_poly() # Zeichnung wird der Variablen re zugewiesen

#Registrieren der Shape unter einem Namen
screen.addshape("rechteck", re)

#Verwenden der Shape
shape("rechteck")

#onklick(fun, btn=1)
#fun:Funktion mit 2 Argumenten
#btn:1 oder 2 oder 3 für die Maustasten

def dreh(xdummy, ydummy):
    left(90)                             #eine Funktion dreh()


onklick(dreh) #Nun sollte sich die Turtle(rechteck) jedesmal
                   #wenn du drauf klickst um 90 Grad
                   #nach links drehen.
Hoffe ich habs richtig hinbekommen und es ist das was du wolltest.

Gruß...busfahrer

p.s: Python für Kids würde ich dir auch empfehlen :)
Alles wird gut ;-)
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Samstag 1. November 2008, 10:37

Hallo

Wunder bar, hat gut geklappt.
Man muss halt onklick durch onclick ersetzen.

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

Samstag 1. November 2008, 10:59

Man muss halt onklick durch onclick ersetzen.
Sorry,kleiner Schreibfehler :wink:

Gruß...busfahrer
Alles wird gut ;-)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Samstag 1. November 2008, 11:09

Mit dem frog-Modul statt xturtle sähe es übrigens so aus:

Code: Alles auswählen

from frog import *

def dreh(event):
    x, y = event["pos"]
    w, h = frog.size
    xmin, xmax = frog.x-w/2, frog.x+w/2
    ymin, ymax = frog.y-h/2, frog.y+h/2
    if xmin<=x<=xmax and ymin<=y<=ymax:
        frog.turn(90)

pool = Pool()
frog = Frog(pool)
frog.shape = "Rechteck", (-20,-10),(20,-10), (20,10), (-20,10)
pool.listen("<Button>",dreh)
pool.ready()
Das ist einer der (wenigen Fälle), wo es mit xturtle eleganter geht, weil das frog-Modul keine Möglichkeit implementiert hat, ein Event direkt an eine Frog-Instanz zu binden.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Samstag 1. November 2008, 11:16

Falls es dir ursprünglich darum ging, überhaupt eine Art Button-Funktionalität zu haben, dann geht das mit dem frog-Modul einfacher:

Code: Alles auswählen

from frog import *

def dreh(event):
    frog.turn(90)

pool = Pool()
frog = Frog(pool)
frog.button("Klick mich!", dreh)
frog.shape = "turtle"
frog.x -= 40
pool.ready()
oder auch kürzer mittels lambda-Ausdruck:

Code: Alles auswählen

pool = Pool()
frog = Frog(pool)
frog.button("Klick mich!", lambda e:frog.turn(90))
frog.shape = "turtle"
frog.x -= 40
pool.ready()
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Samstag 1. November 2008, 13:12

Hallo

@ numerix
Vielen Dank!!!

Mir stellt sich gerade die frage kann man auch mit Canvas einen Button machen?
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Samstag 1. November 2008, 14:21

Andyh hat geschrieben:Mir stellt sich gerade die frage kann man auch mit Canvas einen Button machen?
Ich nehme an, du meinst ein Tkinter Canvas ohne xturtle?

Antwort ist: Ja. Du kannst entweder - so wie es in xturtle intern auch funktioniert - einen Button als Zeichenobjekt erstellen und dann eine entsprechende Eventbindung herstellen, du kannst aber auch in ein Canvas einen echten Tkinter-Button mit voller Funktionalität platzieren. So funktioniert es z.B. auch im frog Modul.
Antworten