Seite 1 von 1

Code aus GUI Builder verwenden

Verfasst: Dienstag 12. Mai 2009, 08:39
von bankkind
Hallo zusammen,

ich habe ein Verständnisproblem mit dem von GUI BUilder erzeugten Code:

Code: Alles auswählen

def _button_1_command(self, *args):
        print "Hallo"
        pass
Mir ist grudnsätzlich klar das Code den ich in diese Funktion schreibe ausgeführt wird, sobald ich den button drücke.

Nun weiß ich nicht wie ich bei Click auf den Button die Anwendung beenden kann. Kann mir mal hier jemand einen Tipp geben?

Verfasst: Dienstag 12. Mai 2009, 09:19
von busfahrer
Hallo
meinst du sowas hier(sehr einfaches Beispiel)

Code: Alles auswählen

 
#!/usr/bin/env python
# -*- coding: utf8 -*-

import Tkinter as tk

def button_command():
    root.destroy()

root = tk.Tk()
button = tk.Button(root, text="Exit",command=button_command)
button.grid()
root.mainloop()
Gruß...busfahrer

Verfasst: Dienstag 12. Mai 2009, 11:10
von bankkind
Ja Danke schonmal, das sit gut soweit, aber funktioniert komsicherweise in meinem Konktreten Beispiel nicht.

Code: Alles auswählen

class CustomHw(Hw):
    pass

    def _button_1_command(self, *args):
        root.destroy()
        
        pass


def main():
    try: userinit()
    except NameError: pass
    root = Tk()
    demo = CustomHw(root)
    root.title('hw')
    try: run()
    except NameError: pass
    root.protocol('WM_DELETE_WINDOW', root.quit)
    root.mainloop()

if __name__ == '__main__': main()
Er erkennt root nicht, obwohl es in main() definiert ist.

Verfasst: Dienstag 12. Mai 2009, 12:11
von BlackJack
@bankkind: Nicht obwohl, sondern weil es in `main()` definiert wird. Ein Verwendungszweck von Funktionen ist ja gerade, das man nicht alles global stehen hat und alle Namen überall sichtbar sind. In diesem Fall könnte man zum Beispiel `CustomHw` im Konstruktor das `root`-Objekt mitgeben, damit in der Methode darauf zugegriffen werden kann.

Du solltest Dir übrigens mal die überflüssigen ``pass``-Anweisungen abgewöhnen.

Und das mit dem `run()` und dem `NameError` ist auch sehr merkwürdig.

Verfasst: Dienstag 12. Mai 2009, 12:32
von bankkind
Grundsätzlich sei einmal gesagt, der Code ist ein specttcl generierter Code aus dem GUI-Builder...

aber:

Code: Alles auswählen

 In diesem Fall könnte man zum Beispiel `CustomHw` im Konstruktor das `root`-Objekt mitgeben, damit in der Methode darauf zugegriffen werden kann.
Wie mache ich das?

Verfasst: Dienstag 12. Mai 2009, 13:05
von EyDu

Code: Alles auswählen

class CustomHw(Hw):
    def __init__(self, root):
        #Hw.__init__(self, root)
        self.root = root
    
    def _button_1_command(self, *args):
        self.root.destroy()

def main():
    ...
    root = Tk()
    demo = CustomHw(root)
    ...
Du solltest vielleicht noch einmal einen Blick ins Tutorial werfen.

Verfasst: Dienstag 12. Mai 2009, 18:12
von bankkind
OK Danke, das funktioniert.

Noch eine Frage: Gibt es in Tkinter auch eine komfortable möglichkeit Tabs(Reiter) zu verwenden, gibt es hierfür eien Komponennte? Oder ist es schon von grund auf empfehlenswert lieber auf ein stärkeres GUI-Toolkit zu wechseln?

Verfasst: Dienstag 12. Mai 2009, 21:59
von numerix
bankkind hat geschrieben:Noch eine Frage: Gibt es in Tkinter auch eine komfortable möglichkeit Tabs(Reiter) zu verwenden, gibt es hierfür eien Komponennte?
Ab Python 3.1 wird es ein Modul tkinter.ttk geben, das ein Notebook-Widget zur Verfügung stellt. Soweit ich weiß, gibt es auch jetzt schon externe Lösungen und ich meine es wäre auch im Forum schonmal behandelt worden - kannst ja mal nach suchen.
bankkind hat geschrieben:Oder ist es schon von grund auf empfehlenswert lieber auf ein stärkeres GUI-Toolkit zu wechseln?
Das hängt davon ab, was du vorhast und wen du fragst ... :)

Verfasst: Dienstag 12. Mai 2009, 23:10
von wuf
Hallo bankkind

Würde dir dieses genügen?:

Bild

Gruss wuf :wink:

Verfasst: Mittwoch 13. Mai 2009, 11:12
von bankkind
wuf hat geschrieben:Hallo bankkind

Würde dir dieses genügen?:

Bild

Gruss wuf :wink:
Perfekt!

@numerix: Im Grunde genommen wird das Tool wa sich bauen möchte nicht viel größer als das in dem Screenshot von wuf.

Verfasst: Mittwoch 13. Mai 2009, 11:46
von wuf
Hallo bankkind

Wenn du es verwenden möchtest musst du aber Pmw installieren.
Hier kannst du mehr erfahren:
http://pmw.sourceforge.net/

Gruss wuf :wink:

Verfasst: Mittwoch 13. Mai 2009, 12:17
von bankkind
was mir nicht so gefällt ist die tatsache das Tkinter diese Funktion nicht mitbringt...

Gibt es eigentlich ein deutsches GUTES tkinter Tutorial?

Verfasst: Mittwoch 13. Mai 2009, 13:13
von wuf
Kennst du schon welche in deutsch geschriebene Bücher?

Gruss wuf :wink:

Verfasst: Mittwoch 13. Mai 2009, 13:34
von numerix
bankkind hat geschrieben:was mir nicht so gefällt ist die tatsache das Tkinter diese Funktion nicht mitbringt...
Dannn warte halt auf Python 3.1 oder - falls du es so eilig hast - probier es mal mit der aktuellen 3.1 Beta 1.
bankkind hat geschrieben:Gibt es eigentlich ein deutsches GUTES tkinter Tutorial?
Falls du irgendetwas kostenloses aus dem Web meinst: Ich kenne keins. Es gibt hier und da was auf deutsch, vielleicht wäre es sogar lohnend, das mal irgendwie zusammenzustellen, aber etwas richtig Gutes habe ich bisher nicht aufgestöbert.

Falls es auch was kosten kann: Im Buch "Objektorientierte Programmierung mit Python" von Michael Weigend gibt es rund 100 Seiten über Tkinter. Reicht zumindest für einen Einstieg.

Edit: Hier zwei deutsche Einführungen in Tkinter:
http://www.wspiegel.de/tkinter/tkinter_index.htm
http://home.foni.net/~heikos/tkinter/index.html

Verfasst: Mittwoch 13. Mai 2009, 14:39
von bankkind
Das Buch scheint wirklich gut zu sein, könnte ich mir ja mal bestellen.