Dumme Frage zu Buttons

Fragen zu Tkinter.
Antworten
Benutzeravatar
Agroschim
User
Beiträge: 28
Registriert: Sonntag 16. September 2007, 15:19

Mittwoch 17. Oktober 2007, 21:59

Code: Alles auswählen

from pygame import mixer
from Tkinter import *

mixer.init()
mixer.music.load('vivre.mp3')

root = Tk()
spiel = Button(root, text = 'Spiel', command = mixer.music.play())
spiel.pack()
root.mainloop()
Kann mir jemand sagen, warum der mir das Liedchen schon spielt, bevor ich den Button drücke?
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Mittwoch 17. Oktober 2007, 22:26

Hallo Agroschim !

Mache mal die Klammern hinter mixer.music.play weg.

gruß frank
BlackJack

Mittwoch 17. Oktober 2007, 22:27

Weil Du ``mixer.music.play()`` *ausführst*!? Das Ergebnis von dem Aufruf wird dann als Kommando an den `Button` übergeben. Du solltest aber hier nicht die Methode aufrufen sondern übergeben. Also die Klammern weglassen.
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

Dienstag 13. November 2007, 21:30

Hallo,

ich habe mein Programm angefangen als Klassen und Funktionen zu strukturieren. Folgendermassen (Problem kommt gleich):

Code: Alles auswählen

class mainWindowApp:

    def __init__( self, master ):

        frame = Frame( master )
        frame.pack()
--schnipp--

--schnapp--

        self.testButton = Button( frame, text="Test", command=getActiveElement( self.lbFirmen, self.lbFirmen.index( ACTIVE ) ) )
        self.testButton.pack()

def getActiveElement( listBox, index ):
    print index
    print listBox.get( index )

root = Tk()
root.title("Python-Bestellskript")

mainWindow = mainWindowApp( root )

root.mainloop()
Unwichtigen Kram hab' ich rausgelassen. Was ich machen moechte ist auf den Knopf "Test" zu druecken und mir dann den jeweiligen Index und Inhalt(Index) einer Listbox, die ebenfalls in mainWindowApp erstellt wird ausgeben.
Beim Starten des Programms wird die Funktion getActiveElement scheinbar einmal ausgefuehrt: Es wird eine 0 auf die Kommandozeile gedruckt, allerdings nicht ListBoxInhalt( 0 )...
Ich glaube ich mache irgendwas generell falsch, komme aber durch rumspielen irgendwie nicht weiter.

Vielen Dank fuer Vorschlaege.
Redprince
User
Beiträge: 128
Registriert: Freitag 22. Oktober 2004, 09:22
Wohnort: Salzgitter
Kontaktdaten:

Dienstag 13. November 2007, 21:52

Liest du auch, was man dir schreibt?
BlackJack hat geschrieben:Weil Du ``mixer.music.play()`` *ausführst*!? Das Ergebnis von dem Aufruf wird dann als Kommando an den `Button` übergeben. Du solltest aber hier nicht die Methode aufrufen sondern übergeben. Also die Klammern weglassen.
I am not part of the allesburner. I am the [url=http://allesburner.de]allesburner[/url].
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

Mittwoch 14. November 2007, 11:06

Redprince: Liest Du auch an wen Du schreibst?

Oder war ich nicht gemeint?
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

Mittwoch 14. November 2007, 14:56

Aber danke trotzdem, sein Problem loest meines auch irgendwie.
Man muss es nur viel umstaendlicher machen, als man es erwarten wuerde: Ich uebergebe eine Funktion command=self.testFunc an den Button, dann

def testFunc( self )
eigentlicheFunktionMitParametern( self.Listbox, self.Listbox.index( ACTIVE ) )
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 14. November 2007, 16:24

Kannst an der Stelle sicherlich auch eine anonyme Funktion mit `lambda` machen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Mittwoch 14. November 2007, 16:36

Oder zumindest eine lokale Funktion statt einer öffentlichen Methode.
Antworten