unzeitiger Start von command

Fragen zu Tkinter.
Antworten
Achimt
User
Beiträge: 19
Registriert: Montag 9. November 2009, 21:57

Ich verwende folgenden Code:
http://paste.pocoo.org/show/151682/

Der Programmlauf öffnet das HauptFenster mit den erwünschten Menus. Bevor ich jedoch irgendeinen Menupunkt anwähle, kommen folgende Ausdrucke:

Code: Alles auswählen

Pfad von  Datenbanken  wechseln  C:\Dokumente und Einstellungen\xy\Eigene Dateien\PythonProject\src\
Tabelle 1 C:\Dokumente und Einstellungen\xy\Eigene Dateien\PythonProject\src\
D.h. die Funktionen PfadWechseln und Tabelle1 (die mit Parametern) werden unzeitig aufgerufen. Woran liegt es?

Oder kann man in TKinter über .add_command keine Funktion mit Parametern aufrufen?

Die Funktion ende() wird korrekterweise erst aufgerufen, wenn ich den entsprechenden Menupunkt wähle.

Frage gleich noch im Anschluss:
Ich möchte nicht nur eine eine Funktion mit Parametern aufrufen, sondern auch einen Wert zurückherhalten:

z.B. in def PfadWechseln(Pfad, Name):

Code: Alles auswählen

return Pfad
Wie kann ich in .add_command diesen Wert zurückerhalten?
BlackJack

@Achimt: Wenn Du so etwas schreibst wie ``foo(bar=blub())``, dann wird *erst* die Funktion `blub()` aufgerufen und dann der *Rückgabewert* dieser Funktion als `bar`-Argument an den `foo()`-Aufruf übergeben. *Du* führst also die Funktionen aus, indem Du sie aufrufst. Bei `ende` rufst Du dagegen die Funtkion nicht auf, sondern übergibst die Funktion *selbst* als Argument. So wie es in diesem Fall sein sollte.

Du möchtest da also nicht `PfadWechseln` übergeben, sondern eine Funktion ohne Argumente, die wenn sie aufgerufen wird ``PfadWechseln(PfadDatenbanken, "Datenbanken"))`` ausführt.

Also kannst Du so eine Funktion mit ``def``, ``lambda``, oder `functools.partial()` erzeugen, und *die* dann übergeben.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Achimt

Hier eine Möglichkeit die Sache in den Griff zu bekommen:
http://paste.pocoo.org/show/151702/

Gruss wuf :wink:
Take it easy Mates!
Achimt
User
Beiträge: 19
Registriert: Montag 9. November 2009, 21:57

Danke an Euch Beide. Fehler begriffen.

Im Bsp. von wuf wird über lampda eine Funktion geschaffen, die nichts weiter macht, als die Funktion PfadWechseln mit den Argumenten PfadDatenbanken und name aufzurufen.

Wenn ich demnach den Code so ändere:

Code: Alles auswählen

    MenuProgramm.add_command(label = "Pfad der Datenbank", \
        command=lambda db_path=PfadDatenbanken, name="Datenbanken":
        PfadDatenBankenNeu = PfadWechseln(db_path, name))
müsste die lampda-Funktion eine Funktion sein, die der Variable PfadDatenBankenNeu, das Ergebnis desFunktionsaufrufes PfadWechseln() zuweist.

nur für mich zum Nachdenken. Werds gleich mal ausprobieren.


...

Nein. passt nicht.
Achimt
User
Beiträge: 19
Registriert: Montag 9. November 2009, 21:57

noch eine Nachfrage zu (oder eher 2 :wink:) :

1. Welche Möglichkeiten habe ich Rückgabewerte von Funktionen in der main() zu erhalten ?

2. In den Funktionen PfadWechseln() und Tabelle1() kann ich nicht auf HauptFenster = Tkinter.Tk() zugreifen (ist ja in der main () definiert). Gibt es noch eine Möglichkeit innerhalb des add_command entsprechende Änderungen am Widgets vorzunehmen (z.B. ein Slave mit einem Label hinzufügen)?
BlackJack

@Achimt: Beide Fragen laufen wohl auf die gleiche Antwort hinaus: Objektorientierte Programmierung. Über eine Klasse kannst Du Funktionen und gemeinsam verwendete Variablen zu einem Objekt zusammenfassen.
Achimt
User
Beiträge: 19
Registriert: Montag 9. November 2009, 21:57

Die Idee ist mir gestern abend aufm Sofa auch gekommen. Ich hab noch nicht viel mit OOP bisher am Hut gehabt. Ich mach mich mal an die Arbeit.
Achimt
User
Beiträge: 19
Registriert: Montag 9. November 2009, 21:57

wen es interessiert: habe es jetzt so gelöst:

http://paste.pocoo.org/show/151866/

Vielen Dank nochmal für die Tipps und Hinweise.
BlackJack

@Achimt: Mal davon abgesehen, dass die Schreibweise der Namen nicht PEP8 entspricht, finde ich `PfadDatenbanken` sehr verwirrend. Es geht ja wohl nicht um Datenbanken für Pfade, sondern um den Pfad zu Datenbanken. Also `datenbankenpfad` oder `datenbanken_pfad`.

Muss denn wirklich alles an das Objekt gebunden werden, was Du ans Objekt bindest? Die Scrollbalken, oder `Beenden` zum Beispiel?

Und was ist mit der Methode, die Grundsätzlich `True` zurück gibt?

Die Kommentare sind teilweise extrem übertrieben. Wenn der Kommentar nichts aussagt, was man nicht leicht an der kommentierten Code-Zeile ablesen kann, dann ist der Kommentar unnötig.
Antworten