Hallo,
weiß jemand, wie man DropDown-Menüs in Tk erstellt???
MFG,
Florian
Menüs in Tkinter
Moin !
Hier mal ein Beispiel :
BuGFiX
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()
-
- 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
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
Voilá:
Doch hier beginnt nun mein Problem:
Wie kann ich das Aussehen des OptionMenu definieren? Sämtliche Zuweisungen wie bei anderen Widgets üblich funktionieren nicht!?!
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()
Wie kann ich das Aussehen des OptionMenu definieren? Sämtliche Zuweisungen wie bei anderen Widgets üblich funktionieren nicht!?!
ist, dass der eintrag "Bitte auswählen" nach der Wahl eines Items nicht mehr sichtbar wird.
mfg
roland
mir ist klar, dass ich keine hilfe war:D
mfg
roland

@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...
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
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
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!?!)
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
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
genau die Fehlermeldung gabs die ganze Zeit...Voges hat geschrieben:... und pack() gibt immer None zurück.

Puhh, so funktioniert das Ganze wie gewohnt... und ich dachte schon das OptionMenu sei nicht konfigurierbar!Voges hat geschrieben:Richtig:
firmaAuswahl = OptionMenu(root, auswahl, *liste)
firmaAuswahl.pack()
firmaAuswahl['menu'].configure(fg="red")

Das benötige ich nichtmal, standardmässiges konfigurieren recht schon völlig aus.Voges hat geschrieben:Ob man die einzelnen Menüeiträge konfigurieren kann, weiß ich nicht. ...
Hab herzlichen Dank! Einfach Spitze Deine Hilfe (und die der vielen anderen im Forum)

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

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()
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 ?!?
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 ?!?
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.Bugfix hat geschrieben: [...] Fehler des Optionsmenüs entfernt die NIE in Tkinter übernommen wurden sind.
Trotzdem stell ich mich noch zu blöd an und krieg das Pulldown-Menü vom OptionMenu nicht konfiguriert

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.lbuega hat geschrieben:aber dass muss doch gehen, ist ja lt. Quellcode ja ein ganz normales Menu-Objekt...
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

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()

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.
Sorry, war mal wieder nicht angemeldet...
und mit 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.
das ist richtig, aber in der Klasse OptionMenu wird u.a. auch folgendes Objekt erstellen:Voges hat geschrieben:Leider nicht. OptionMenu ist von MenuButton abgeleitet.
Code: Alles auswählen
menu = self.__menu = Menu(self, name="menu", tearoff=0)
Code: Alles auswählen
menu.add_command(label=value, .... siehe Tkinter.py