Seite 1 von 2

Menüs in Tkinter

Verfasst: Mittwoch 9. Juli 2003, 14:18
von Pythonaya
Hallo,
weiß jemand, wie man DropDown-Menüs in Tk erstellt???



MFG,
Florian

Verfasst: Mittwoch 9. Juli 2003, 16:19
von Bugfix
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

Verfasst: Mittwoch 9. Juli 2003, 19:06
von Pythonaya
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

Verfasst: Mittwoch 9. Juli 2003, 20:09
von hans
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

Verfasst: Freitag 11. Juli 2003, 11:02
von lbuega
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!?!

auch ein problem....

Verfasst: Freitag 11. Juli 2003, 11:28
von 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

Verfasst: Freitag 11. Juli 2003, 13:07
von 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

Verfasst: Samstag 12. Juli 2003, 11:37
von 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

Verfasst: Samstag 12. Juli 2003, 12:21
von Dookie
das sind aber zwei verschiedene paar Stiefe, äh Menus ;)

wieso???

Verfasst: Samstag 12. Juli 2003, 14:15
von gast,alias rolgal
es ging ja nur darum ob der menü namen sichtbar ist oder nicht???

Verfasst: Montag 14. Juli 2003, 08:05
von lbuega
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!?!)

Verfasst: Montag 14. Juli 2003, 09:33
von Voges
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

Verfasst: Montag 14. Juli 2003, 15:40
von lbuega
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

Verfasst: Montag 21. Juli 2003, 12:25
von 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()

Verfasst: Montag 21. Juli 2003, 14:12
von Bugfix
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 ?!?

Verfasst: Dienstag 22. Juli 2003, 13:58
von lbuega
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???

Verfasst: Dienstag 22. Juli 2003, 14:41
von Voges
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

Verfasst: Dienstag 22. Juli 2003, 15:19
von 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.

Verfasst: Dienstag 22. Juli 2003, 15:28
von lbuega
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.

Verfasst: Mittwoch 23. Juli 2003, 15:26
von lbuega
help!?! :(