Seite 1 von 1

unzeitiger Start von command

Verfasst: Donnerstag 19. November 2009, 17:04
von Achimt
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?

Verfasst: Donnerstag 19. November 2009, 17:45
von 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.

Verfasst: Donnerstag 19. November 2009, 17:46
von wuf
Hallo Achimt

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

Gruss wuf :wink:

Verfasst: Donnerstag 19. November 2009, 18:39
von Achimt
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.

Verfasst: Donnerstag 19. November 2009, 20:03
von Achimt
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)?

Verfasst: Donnerstag 19. November 2009, 20:24
von 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.

Verfasst: Freitag 20. November 2009, 07:48
von Achimt
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.

Verfasst: Freitag 20. November 2009, 10:47
von Achimt
wen es interessiert: habe es jetzt so gelöst:

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

Vielen Dank nochmal für die Tipps und Hinweise.

Verfasst: Freitag 20. November 2009, 19:25
von 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.