Einträge in Menüleiste sperren ?

Fragen zu Tkinter.
Antworten
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo !

Ich würde gerne Einträge in der Menüleiste sperren.

Code: Alles auswählen

import Tkinter as tk

def speichern():
    print 'gespeichert'

fenster = tk.Tk()
leiste = tk.Menu(fenster)
menue = tk.Menu(leiste)
leiste.add_cascade(label = 'Datei', menu = menue)
menue.add_command(label = 'Speichern', command = speichern)
fenster.config(menu = leiste)
fenster.tk.mainloop()
Wie kann ich den Eintrag Speichern sperren un entsperren ?

gruß frank
BlackJack

Mit der `entryconfig()`-Methode den `state` auf `Tkinter.NORMAL` oder `Tkinter.DISABLED` setzen.

Also zum Beispiel:

Code: Alles auswählen

menue.entryconfig(1, state=tk.DISABLED)
# oder
file_menue.entryconfig('Speichern', state=tk.DISABLED)
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke BlackJack !

das mit .config(state = NORMAL bzw. state = DISABELD) - kenne ich bei Button und Entrys, doch bei der Menüleiste will es nicht so hinhauen.

Probiere Deine Hilfe mal aus !
gruß frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo!

So sollte es sein !

Code: Alles auswählen

import Tkinter as tk

def speichern():
    print 'gespeichert'


def sperren():
    menue.entryconfig(1, state = tk.DISABLED)
    

fenster = tk.Tk()
leiste = tk.Menu(fenster)
menue = tk.Menu(leiste)
leiste.add_cascade(label = 'Datei', menu = menue)
menue.add_command(label = 'Speichern', command = speichern)
fenster.config(menu = leiste)
button = tk.Button(fenster, text = 'OK', width = 10, command = sperren)
button.grid()
fenster.tk.mainloop()
gruß frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo BlackJack !

Das geht mal nicht - oder habe ich was falsch verstanden ? Wäre zum itterieren über eine Liste mit Namen natürlich schöner !

Code: Alles auswählen

import Tkinter as tk

def speichern():
    print 'gespeichert'


def sperren():
    file_menue.entryconfig('Speichern', state = tk.DISABLED)
   

fenster = tk.Tk()
leiste = tk.Menu(fenster)
menue = tk.Menu(leiste)
leiste.add_cascade(label = 'Datei', menu = menue)
menue.add_command(label = 'Speichern', command = speichern)
fenster.config(menu = leiste)
button = tk.Button(fenster, text = 'OK', width = 10, command = sperren)
button.grid()
fenster.tk.mainloop()
gruß frank
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

So müsste es funktionieren:

Code: Alles auswählen

file_menue.entryconfig(file_menue.index('Speichern'), state = tk.DISABLED)
Du solltest die Texte dann aber in einer "Konstanten" speichern. Sonst musst du Sie bei Änderungen ja an mehreren Stellen anpassen. Z.B. so:

Code: Alles auswählen

SAVE = 'Speichern'
...
file_menue.entryconfig(file_menue.index(SAVE), state = tk.DISABLED)
...
menue.add_command(label = SAVE, command = speichern)
MfG
HWK
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke HWK !

So würde ich es jetzt machen ! Nicht mit einer einzelnen Konstanten. Nun kann man noch weiter Einträge hinzufügen - oder hast du es so gemeint ?

Code: Alles auswählen

import Tkinter as tk

def laden():
    print 'geladen'

def speichern():
    print 'gespeichert'

def schliessen():
    fenster.destroy()

def sperren():
    for text, unoetig in menue_leiste:
        menue.entryconfig(menue.index(text), state = tk.DISABLED)

menue_leiste = (('Laden', laden),
                ('Speichern' , speichern),
                ('Schliessen', schliessen))

fenster = tk.Tk()
leiste = tk.Menu(fenster)
menue = tk.Menu(leiste)
leiste.add_cascade(label = 'Datei', menu = menue)
for text, command in menue_leiste:
    menue.add_command(label = text, command = command)
fenster.config(menu = leiste)
button = tk.Button(fenster, text = 'OK', width = 10, command = sperren)
button.grid()
fenster.tk.mainloop()
gruß frank
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Besser vielleicht so:

Code: Alles auswählen

menue_leiste = {'Laden': laden,
                'Speichern': speichern,
                'Schliessen': schliessen}
Ich würde es eher sogar so machen:

Code: Alles auswählen

menue_leiste = {'LOAD': ('Laden', laden),
                'SAVE': ('Speichern', speichern),
                'CLOSE': ('Schliessen', schliessen)}
Dann kannst Du auch einfach die Bezeichnungen der Menüeinträge an einer einzigen Stelle ändern, was bei komplizierteren Aktionen als Laden etc. ja durchaus vorkommen kann, und hast trotzdem Zugriff über einen lesbaren Namen. Das wolltest Du ja eigentlich. Wenn Du nur in den Schleifen auf die komplette Liste zugreifst, ist es natürlich egal.
MfG
HWK
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke HWK !

Mit einer dict() hatte ich auch schon die Idee, doch wird die Anordnung durch die Eigenschaft einer dict() vorgegeben - oder habe ich dies falsch verstanden ?

Code: Alles auswählen

import Tkinter as tk

def laden():
    print 'geladen'

def speichern():
    print 'gespeichert'

def schliessen():
    fenster.destroy()

def sperren():
    for text in menue_leiste.keys():
        menue.entryconfig(text, state = tk.DISABLED)

menue_leiste = {'Laden' : ('Laden', laden),
                'Schliessen' : ('Schliessen', schliessen),
                'Speichern' : ('Speichern' , speichern)}

fenster = tk.Tk()
leiste = tk.Menu(fenster)
menue = tk.Menu(leiste)
leiste.add_cascade(label = 'Datei', menu = menue)
for text, command in menue_leiste.values():
    menue.add_command(label = text, command = command)
fenster.config(menu = leiste)
button = tk.Button(fenster, text = 'OK', width = 10, command = sperren)
button.grid()
fenster.tk.mainloop() 
gruß frank
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Code: Alles auswählen

def sperren():
    for text, command in menue_leiste.values():
        menue.entryconfig(menue.index(text), state = tk.DISABLED)
Die Keys sind dafür gedacht, auf einen einzelnen Eintrag über einen leserlichen Eintrag zugreifen zu können, z.B. so:

Code: Alles auswählen

menue.entryconfig(menue.index(menue_leiste['Laden'][0]), state = tk.DISABLED)
Evtl. willst Du später ja

Code: Alles auswählen

'Laden' : ('Laden', laden)
in

Code: Alles auswählen

'Laden': ('Eine tolle Datei laden', laden) 
ändern. Dann brauchst Du das nur im Dict anpassen, die Aufrufe erfolgen aber immer über denselben Key 'Laden'. Wenn Du sowieso nur in Schleifen über die komplette menue_leiste darauf zugreifst, kannst Du Dir natürlich ein Dict sparen.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke HWK !

Bei der Erstellung der Oberfläche itteriere ich doch über die Dict() oder formulierst du jeden Menüeintrag selbst ? Die Anordnung von 'Laden', Sch ..', '..' ist doch durch die Dict() vorgegeben und ich kann diese nicht beinflussen - oder ?

gruß frank
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beim Erstellen schon. Aber manchmal will man ja nur einzelne Einträge aktivieren, deaktivieren etc. Falls Du dies nicht brauchst, nimm lieber eine Liste wie in Deinem drittletzten Beitrag. Aber warum wäre dann Iterieren über eine Liste mit Namen schöner?
Das geht mal nicht - oder habe ich was falsch verstanden ? Wäre zum itterieren über eine Liste mit Namen natürlich schöner !
MfG
HWK
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke HWK !

Na beim Erstellen vom mehreren Button, Label, Menue oder so itteriere ich über eine Liste, damit ich sie nicht einzeln ausformulieren muß. Möchte ich diese Sperren oder Entsperren, dann nehme ich diese Liste. Beim Sperren einzelner Button etc. ist die Dict -Version natürlich schöner, da ich im code sehe was ich da so gemacht habe. Bei einer Dict() ist die Sortierung nicht möglich. Die sortiert nach ihren eigenen Regeln - oder ich müsste in den Text eine 1, 2 ,3 etc. einfügen oder den ersten Menüeintrag mit A den zweiten mit B usw. beginnen lassen. Dann könnte sie man mit sorted(dict()) in die gewünschte Reihenfolge bringen.

gruss frank
Antworten