Methode mit Button aufrufen

Fragen zu Tkinter.
Antworten
semper27
User
Beiträge: 14
Registriert: Freitag 24. April 2015, 16:14

Hi,
ich würde gerne immer wenn ein Button gedrückt wird einen entsprechenden Text im Textfeld anzeigen lassen. Leider klappt es nicht so wie ich es probiert habe. Könnt ihr mir helfen den Fehler zu finden?

Code: Alles auswählen

import Tkinter as tk

class MainFrame(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        
        self.textfeld = tk.Text(self)
        self.textfeld.pack(side=tk.RIGHT)
        
        self.text1_button = tk.Button(self, text='text 1', command=self.schreibe("1"))
        self.text1_button.pack(fill=tk.X)

        self.text2_button = tk.Button(self, text='text 2', command=self.schreibe("1"))
        self.text2_button.pack(fill=tk.X)

    def scheibe(self, text):
        self.befehle.insert(tk.END, text)

def main():
    root = tk.Tk()
    main_frame = MainFrame(root)
    main_frame.pack()
    root.mainloop()

    
if __name__ == '__main__':
    main()
BlackJack

@semper27: *Du* rufst die Methode in der `__init__()` auf und für das `command`-Argument wird dann der *Rückgabewert* von der Methode übergeben. Was ein implizites `None` ist und das kann nicht aufgerufen werden wenn der Benutzer die Schaltfläche drückt.

Du musst dort nicht `self.schreibe()` aufrufen sondern etwas übergeben das wenn es aufgerufen wird erst `self.schreibe()` mit dem entsprechenden Wert aufruft. Schau Dir mal `functools.partial()` an.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du solltest auch immer genau beschreiben, *was* nicht geht bzw. auch Fehlermeldungen mit posten, sofern vorhanden! Einfach nur "geht nicht" oder "klappt nicht" reichen meist nicht aus.

Der Kenner sieht hier natürlich sofort, dass Du die Kommandos für die Buttons *falsch* übergibst. Dabei hattest Du das schon einmal richtigt gemacht, bzw. Dir wurde es auch schon einmal richtig gezeigt: http://www.python-forum.de/viewtopic.ph ... 89#p276289

Schau Dir in dem Link mal die Übergabe beim Start- und Stopp-Button an! ;-)

Dazu kommt noch, dass ``self.schreibe`` unbekannt ist - denn als Methode gibt es nur ``scheibe`` :P

Bevor Du dann weiter fragst: Du musst Dir hier ergänzend zum oben gesagten ein ``functools.partial``-Objekt erstellen und als Kommando übergeben, da Du feste Parameter an das Kommando binden willst.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
semper27
User
Beiträge: 14
Registriert: Freitag 24. April 2015, 16:14

Danke für eure Antworten, aber so richtig verstehe das mit partial nicht. Was ich dazu gefunden habe war
"Partial functions allow one to derive a function with x parameters to a function with fewer parameters and fixed values set for the more limited function"
aber nicht wie man eine funktion ohne Parameter ableitet, um sie dann mit command verwenden zu können.

bei

Code: Alles auswählen

command=partial(self.schreibe, "1")
kommt der Fehler
Fehler: AttributeError: MainFrame instance has no attribute 'schreibe'

Das Programm hat eh nur eine Klasse und irgendwie tue ich mir noch recht schwer mit OOP in Python :oops:, meint Ihr es wäre da sinnvoll, wenn ich den schon von Hyperion gelinkten Code von BlackJack(GUI mit Schleife) einfach so ohne Klasse umschreibe?
BlackJack

@semper27: Genau so funktioniert das Du musst Dich halt nur entscheiden ob die Methode `schreibe` oder `scheibe` heissen soll. ;-)

Edit: GUI ohne OOP macht in Python eher keinen Sinn. Dann müsste man mit Closures arbeiten, die sind aber nicht das Mittel der Wahl in Python weil OOP dafür vorgesehen ist. Und einfacher zu verstehen dürften Closures auch nicht sein.
semper27
User
Beiträge: 14
Registriert: Freitag 24. April 2015, 16:14

Haha, stundenlang gesucht und dann lag es vorallem am scheibe statt schreibe! Den Aufruf der Methode hatte ich vorher schonmal mit lambda richtig. Jetzt funktionert es. Danke!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Darauf hatte ich Dich bereits in meinem Posting hingewiesen... genaues Lesen hätte Dir da Zeit gespart :P
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten