Checkbuttons mit Short cuts (Alt-1, Alt-2, ... ) belegen

Fragen zu Tkinter.
Antworten
egerlach
User
Beiträge: 41
Registriert: Samstag 14. März 2009, 21:32

Hallo,
ich will Checkbuttons mit Short cuts (Alt-1, Alt-2, ... ) belegen:

Code: Alles auswählen

import Tkinter as tk
def myQuit():
      quit()

root=tk.Tk()
var = tk.StringVar()
tk.Checkbutton(text="hallo", onvalue=1, variable = var).pack()
tk.Checkbutton(text="hallo2", onvalue=2, variable = var).pack()
c=tk.Checkbutton(text="hallo3", onvalue=3, variable = var).pack()
#c.bind('<F1>',lambda e:myQuit())
#c.bind('<Alt>+<1>',lambda e:myQuit())
#c.bind('<Alt>+<F1>',lambda e:myQuit())

tk.Button(text = "ausgabe").pack()
root.bind('<Escape>',lambda e:myQuit())
tk.mainloop()
In dem Beispielt funktioniert die Belegung des gesamten Fensters mit "Escape" bestens: das Fenster schließt. Nun will ich die Checkbuttons mit Alt-1 oder F1 oder Alt-F1, Alt-2 oder ..... belegen. Das funktioniert noch nicht. Die im Code auskommentierte Zeile bringt die Fehlermeldung:
AttributeError: 'NoneType' object has no attribute 'bind'
Natürlich will ich mit den shortcuts der Checkbuttons kein quit ausführen, es sollen nur die buttons ausgewählt werden, also der Aufruf von bind ohne Funktionsaufruf: ....bind('<F1>'). Das ist aber der zweite Schritt, zunächst schaffe ich es gar nicht einen Short cut einem Checkbutton zuzuordnen.

Gruss Eckard
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

c = tk.Checkbutton(text="hallo3", onvalue=3, variable = var)
c.pack()
c.bind('<F1>',lambda e:myQuit())
Die Fehlermeldung sagt doch auch, dass c den Wert "None" hat.
Das Leben ist wie ein Tennisball.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Lektüre-Tipp zum Grundverständnis von Tkinter: http://www.ferg.org/thinking_in_tkinter ... grams.html
egerlach
User
Beiträge: 41
Registriert: Samstag 14. März 2009, 21:32

EyDu hat geschrieben:

Code: Alles auswählen

c = tk.Checkbutton(text="hallo3", onvalue=3, variable = var)
c.pack()
c.bind('<F1>',lambda e:myQuit())
Danke für den Hinweis, durch pack() am Ende wird c eben zu null. OK.

Aber F1 funktioniert so nicht! Auch Alt-F1, Return, oder Escape funktioniert nicht.
Zum Beispielt das root.bind [...] auskommentiert und das

Code: Alles auswählen

c.bind('<Escape>',lambda e:myQuit()) 
eingefügt.

Wie mache ich es richtig?
Zuletzt geändert von egerlach am Mittwoch 6. Mai 2009, 14:54, insgesamt 1-mal geändert.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()
editor = tk.Text(root)
editor.bind("<F1>", lambda e: editor.insert("0.0","F1"))
editor.pack()
editor.focus_set()
root.mainloop()
Dringende Empfehlung: Nimm dir Zeit, um in der Tkinter-Doku zu lesen!
egerlach
User
Beiträge: 41
Registriert: Samstag 14. März 2009, 21:32

Du, Dein Programmbeispiel fügt den String "F1" an Position (0.0) in ein Editorfenster ein. Das hat aber nichts mit meinem Problem zu tun
Dringende Empfehlung: Nimm dir Zeit, um in der Tkinter-Doku zu lesen!
Klar, das wäre das beste! Habe hier ein dutzend Empfehlungen rumliegen. Habe leider nicht Zeit ich überall einzuarbeiten, ich soll hier ein Ding programmieren und dann vielleicht nie wieder! Dann nutzt mir das Tkinter-Fachwissen nichts mehr - und ist schnell wieder vergessen.

Wer weiss wie ich einem Check-/Radiobutton ein shortcut zuweise?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

egerlach hat geschrieben:Du, Dein Programmbeispiel fügt den String "F1" an Position (0.0) in ein Editorfenster ein. Das hat aber nichts mit meinem Problem zu tun
Ich weiß, was mein Code macht ...
Sicher hat es was mit deinem Problem zu tun - es ist nur nicht die fix-und-fertig-Lösung, sondern sollte die Richtung weisen. Ein bisschen Arbeit darf für dich ja noch übrig bleiben.

Um dein spezielles Problem zu lösen gehst du im Prinzip genauso vor. Statt jedoch den Focus auf einen Radiobutton zu setzen, was ja nicht sinnvoll ist, kannst du z.B. die Tastatur-Events an root binden. Als Event-Handler verwendest du dann die select-Methode der Widgets.
egerlach
User
Beiträge: 41
Registriert: Samstag 14. März 2009, 21:32

Danke, ich habs! Es müssen die Tastatureingaben eben an das gesamte Fenster (=root) gebunden werden, sonst gehts nicht, wie Du sagtest:

Code: Alles auswählen

def toggleRadiobutton3(c):
      c.toggle()
      #print "asdasdasd"  #debug

root=tk.Tk()
var1 = tk.StringVar()
var2 = tk.StringVar()
var3 = tk.StringVar()
tk.Checkbutton(text="hallo", onvalue=1, variable = var1).pack()
tk.Checkbutton(text="hallo2", onvalue=2, variable = var2).pack()
c=tk.Checkbutton(text="hallo3", onvalue=3, variable = var3)
c.pack()
tk.Button(text = "ausgabe").pack()
root.bind('<F1>',lambda e:toggleRadiobutton3(c))
tk.mainloop()
Mit F1 kann ich den Checkbutton Nr 3 toggle'n.
Gehts auch anderst? Eleganter? - Natürlich will ich das ganze letztendlich in einer Schleife haben, mit bis zu 9 Checkbuttons.

Gruss
Eckard
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Klar, das wäre das beste! Habe hier ein dutzend Empfehlungen rumliegen. Habe leider nicht Zeit ich überall einzuarbeiten, ich soll hier ein Ding programmieren und dann vielleicht nie wieder! Dann nutzt mir das Tkinter-Fachwissen nichts mehr - und ist schnell wieder vergessen.
@egerlach:
Anscheinend bist Du ziemlich vergesslich.
http://www.python-forum.de/topic-18397.html
egerlach
User
Beiträge: 41
Registriert: Samstag 14. März 2009, 21:32

yipyip hat geschrieben:
@egerlach:
Anscheinend bist Du ziemlich vergesslich.
http://www.python-forum.de/topic-18397.html
Tja, Alzheimer, das Alter, .... :lol: Habe mich immerhin daran erinnert, als die Lösung kam. Nicht schlecht, oder? :wink:

So, nochmals: geht auch eleganter als oben von mir eroiert?
BlackJack

Code: Alles auswählen

import Tkinter as tk


def main():
    root = tk.Tk()
    
    choice = list()
    for i, text in enumerate(['hallo', 'hallo1', 'hallo2']):
        key_nr = i + 1
        variable = tk.StringVar()
        checkbutton = tk.Checkbutton(text=text,
                                     onvalue=key_nr,
                                     variable=variable)
        checkbutton.pack()
        choice.append(variable)
        root.bind('<F%d>' % key_nr, lambda dummy, c=checkbutton: c.toggle())
    
    def print_choice():
        print [c.get() for c in choice]
    
    tk.Button(text='Ausgabe', command=print_choice).pack()
    
    root.mainloop()
Antworten