Menüs in Tkinter

Fragen zu Tkinter.
Pythonaya
User
Beiträge: 90
Registriert: Sonntag 26. Januar 2003, 11:34
Wohnort: Großbeeren (nahe Berlin)

Hallo,
weiß jemand, wie man DropDown-Menüs in Tk erstellt???



MFG,
Florian
Bugfix
User
Beiträge: 30
Registriert: Mittwoch 9. Juli 2003, 15:58

Moin !

Hier mal ein Beispiel :

Code: Alles auswählen

from Tkinter import *
import Tkinter

def function():
    print 'Funktion !'

root = Tk()

menu = Menu(root)
root.config(menu=menu)

filemenu = Menu(menu)
menu.add_cascade(label='Datei', menu=filemenu)
filemenu.add_command(label='New', command=function)
filemenu.add_command(label='Öpen...', command=function)
filemenu.add_command(label='Save', command=function)
filemenu.add_command(label='Save as', command=function)
filemenu.add_separator()
filemenu.add_command(label='Quit', command=function)

helpmenu = Menu(menu)
menu.add_cascade(label='Help', menu=helpmenu)
helpmenu.add_command(label='About', command=function)

mainloop()
BuGFiX
Pythonaya
User
Beiträge: 90
Registriert: Sonntag 26. Januar 2003, 11:34
Wohnort: Großbeeren (nahe Berlin)

Ja, das kenn ich auch!
Eine DropDown-Leiste bzw. Menübar...
Ich meine ein DropDownmenü, wie z.B. die Addresseneingabe im Internet Explorer.
Ein Textwidget, wo rechts daneben ein Button mit einem Pfeil ist, um das Menü auszufahren.


MFG,
Florian
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Mache zwar nicht in TKInter, aber icgh hab mal aus Lusts und Laune gestöbert. Wenn ich das richtig gesehen habe, meinst du eine Combobox oder eine Listbox. Hoffe das hilft dir schon weiter.

Hans
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

Voilá:

Code: Alles auswählen

from Tkinter import*

root = Tk()

auswahl = StringVar()
#wenn keine StringVar(), wird Auswahl nicht angezeigt

liste = ["item1", "item2", "item3"]

auswahl.set("Bitte auswählen")
#ODER ALTERNATIV: auswahl.set(liste[2])

firmaAuswahl = OptionMenu(root, auswahl, *liste).pack()
#ODER ALTERNATIV: OptionMenu(root, auswahl, "item1", "item2", "usw.")

root.mainloop()
Doch hier beginnt nun mein Problem:
Wie kann ich das Aussehen des OptionMenu definieren? Sämtliche Zuweisungen wie bei anderen Widgets üblich funktionieren nicht!?!
Gast

ist, dass der eintrag "Bitte auswählen" nach der Wahl eines Items nicht mehr sichtbar wird.

mfg

roland

:roll: mir ist klar, dass ich keine hilfe war:D
Gast

@rolgal: ??? äh, das ließe sich schon einrichten - macht aber meines erachtens dann wenig Sinn! Sobald du ja einmal was ausgewählt hast, solltest Du ja wissen wo man wählen muß und zudem willst Du die Auswahl ja auch sehen!?!. Kannst ja statt "Bitte auswählen" auch z.B. die aktuelle gesetzte Einstellung aus einer Datei auslesen und anzeigen lassen (wenn da eben die Auswahl gespeichert ist und wird) oder eben eine default-Auswahl aus der Liste...
Gast

naja, kommt wohl drauf an, wieviele menüs es dann geben soll???

bei einem ist es egal, ich bin aber davon ausgegangen, dass es mehrere werde und ja nicht beim text "bitte auswählen" bleibt.....

um es zu verdeutlichen, der menünamen "bookmarks" (im browser) verschwindet ja auch net, wenn du einen links ausgewählt hast.

mfg

roland
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

das sind aber zwei verschiedene paar Stiefe, äh Menus ;)
gast,alias rolgal

es ging ja nur darum ob der menü namen sichtbar ist oder nicht???
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

Bevor hier noch mehr aneinander vorbeigeredet wird: Hat vielleicht jmd. eine Antwort auf meine Frage (s.o.: Wie kann ich das Aussehen des "OptionMenu" definieren? Sämtliche Zuweisungen wie bei anderen Tkinter-Widgets üblich funktionieren nämlich nicht!?!)
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!

Aus Deinem Code:
firmaAuswahl = OptionMenu(root, auswahl, *liste).pack()
Sowas mach' ich auch hin und wieder gerne. Hier ruftst Du pack() auf und pack() gibt immer None zurück. Richtig:
firmaAuswahl = OptionMenu(root, auswahl, *liste)
firmaAuswahl.pack()
firmaAuswahl['menu'].configure(fg="red")

Ob man die einzelnen Menüeiträge konfigurieren kann, weiß ich nicht. Ansonsten gugel mal in comp.lang.python noch "OptionMenu". Meist wird empfohlen, das OptionMenu der MegaWidgets zu verwenden.

Jan
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

Voges hat geschrieben:... und pack() gibt immer None zurück.
genau die Fehlermeldung gabs die ganze Zeit... :?
Voges hat geschrieben:Richtig:
firmaAuswahl = OptionMenu(root, auswahl, *liste)
firmaAuswahl.pack()
firmaAuswahl['menu'].configure(fg="red")
Puhh, so funktioniert das Ganze wie gewohnt... und ich dachte schon das OptionMenu sei nicht konfigurierbar! :oops:
Voges hat geschrieben:Ob man die einzelnen Menüeiträge konfigurieren kann, weiß ich nicht. ...
Das benötige ich nichtmal, standardmässiges konfigurieren recht schon völlig aus.

Hab herzlichen Dank! Einfach Spitze Deine Hilfe (und die der vielen anderen im Forum) :D
Gast

lbuega hat geschrieben:
Voges hat geschrieben:Ob man die einzelnen Menüeiträge konfigurieren kann, weiß ich nicht. ...
Das benötige ich nichtmal, standardmässiges konfigurieren recht schon völlig aus.
mmmh, Fehlanzeige. Nun benötig ich's doch. Aber unter den Optionen scheint sich keine Möglichkeit zu finden :?:

Des weiteren hab ich das Problem, dass sich die Itemliste des 2. Auswahlmenüs in Abhängigkeit der Auswahl des 1. Menüs ändern soll:

Code: Alles auswählen

from Tkinter import*

root = Tk()
root.config(bg="grey")

auswahl_1 = StringVar()
auswahl_2 = StringVar()
liste_1 = ["item1", "item2", "item3"]
liste_2 = ["Auswahl treffen"]

aussehen = {"bg":"grey","font":"arial 10 bold","relief":SUNKEN, "width":15, "activebackground":"darkblue", "activeforeground":"white"}

auswahl_1.set("Auswahl treffen")
auswahl_2.set("Auswahl treffen")

menu_1 = OptionMenu(root, auswahl_1, *liste_1)
menu_1.pack(padx=20, pady=20) 
menu_1.config(aussehen)

menu_2 = OptionMenu(root, auswahl_2, *liste_2)
menu_2.pack(padx=20, pady=20) 
menu_2.config(aussehen)

def change(event):
    #je nach Auswahl, menu_2-Inhalt aufbauen
    if auswahl_1.get() == "item1":
        liste_neu = ["a", "b", "c"]
    elif auswahl_1.get() == "item2":
        liste_neu = ["x1", "x2", "x3"]
    else auswahl_1.get() == "item3":
        liste_neu = ["Hund", "Katze", "Maus"]
    #PROBLEM: wie funktioniert die Inhalts-Zuweisung zu menu_2 ?!?

menu_1.bind("<...?...>", change) #PROBLEM: <ButtonRelease-1> funktioniert nicht, da sich da ja erst die Dropdown-Liste aufklappt und noch keine Auswahl getroffen wurde.

root.mainloop()
Bugfix
User
Beiträge: 30
Registriert: Mittwoch 9. Juli 2003, 15:58

Das Ding scheint immernoch Fehler zu haben, ich hab über Google dazu was gefunden :

http://mail.python.org/pipermail/patche ... 00137.html

Dort wurden anscheinend ein paar Fehler des Optionsmenüs entfernt die NIE in Tkinter übernommen wurden sind. Bzw nun veraltet sind...
Diese Version scheint aber auch Commands zu akzeptieren... :)

Mal testen...

*
Habe mich damit mal befasst, aber einen Command in so ein Optionsmenü zu bekommen will bei mir nicht gehen ?!?
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

Bugfix hat geschrieben: [...] Fehler des Optionsmenüs entfernt die NIE in Tkinter übernommen wurden sind.
Falsch. Hab mal in Tkinter.py nachgeschaut, die haben das tatsächlich umgestetzt. Ist ziemlich genauso wie in dem Patch beschrieben in Tkinter.py (ab Zeile 2890 bei Python-Version 2.2.2) übernommen worden!!! Schau mal nach.

Trotzdem stell ich mich noch zu blöd an und krieg das Pulldown-Menü vom OptionMenu nicht konfiguriert :cry: aber dass muss doch gehen, ist ja lt. Quellcode ja ein ganz normales Menu-Objekt... Aber wie???
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

lbuega hat geschrieben:aber dass muss doch gehen, ist ja lt. Quellcode ja ein ganz normales Menu-Objekt...
Leider nicht. OptionMenu ist von MenuButton abgeleitet. Ich vermute mal, dass Du keine Chance hast, sowas wie eine Callback-Funktion anzubinden. In solchen Fällen, wenn also keine Callback-Funktion anbindbar ist, wird tatsächlich empfohlen, über eine Zeitfunktion alle Nase lang auf Änderungen einer Variablen zu reagieren. Scheint bei einigen Tkinter-Widgets nötig zu sein.

Einen interessanten Artikel fand ich aber eben noch: http://groups.google.de/groups?ie=UTF-8 ... 1.deja.com. Vielleicht kannst Du da noch was mit anfangen.

Jan
Gast

:D YEAH, habs z.T. geschafft. Es geht doch: Nach intensivem Quellcode-Studium von Tkinter.py hab ich rausgefunden wie man ein "command" an die Items im Pulldown-Menü eines OptionMenu binden:

Code: Alles auswählen

from Tkinter import*

root = Tk()
root.config(bg="grey")

auswahl_1 = StringVar()
liste_1 = ["item1", "item2", "item3"]
aussehen = {"bg":"grey","font":"arial 10 bold","relief":SUNKEN, "width":15, "activebackground":"darkblue", "activeforeground":"white"}
auswahl_1.set("Auswahl treffen")

def holla(self):
    print "HEHE!!!"

#'command' ist das einzige keyword das unterstützt wird!
com = {"command":holla}

menu_1 = OptionMenu(root, auswahl_1, *liste_1, **com)
menu_1.pack(padx=20, pady=20)
menu_1.config(aussehen)

#wie kann ich auf das interne menu zugreifen??? Z.B. um Farbe zu ändern etc.
#menu_1.self.menu.add_command(label="TEST", command=holla)

root.mainloop()
Aber damit ist mein Aussehen-Problem noch nicht behoben :x

Voges, könntest Du mal bitte ein Blick in die Tkinter.py (codzeile s.voriger Beitrag) werfen, da ist nämlich die OptionMenu-Klasse. Dort wird u.a. das Pulldownmenü als ganz normales Objekt der Klasse "Menu" erstellt, aber wie kann ich da von aussen darauf zugreifen, um z.B. den Hintergrundfarbe/Schrift/etc. zu konfigurieren? :(
Du scheinst da mehr die Ahnung von zu haben wie das funktioniert.
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

Sorry, war mal wieder nicht angemeldet...
Voges hat geschrieben:Leider nicht. OptionMenu ist von MenuButton abgeleitet.
das ist richtig, aber in der Klasse OptionMenu wird u.a. auch folgendes Objekt erstellen:

Code: Alles auswählen

menu = self.__menu = Menu(self, name="menu", tearoff=0)
und mit

Code: Alles auswählen

menu.add_command(label=value, .... siehe Tkinter.py
werden dann die entsprechenden in den values übergebenen Einträge aufgebaut. Leider ist es mir da aber noch nicht gelungen auf des menu zuzugreifen um es quasi optisch an meine GUI anzupassen!!! Naja, dabei hab ich wenigstens das mit dem optionalen "command" entdeckt.
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

help!?! :(
Antworten