Seite 1 von 1

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

Verfasst: Mittwoch 6. Mai 2009, 14:15
von egerlach
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

Verfasst: Mittwoch 6. Mai 2009, 14:27
von EyDu

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.

Verfasst: Mittwoch 6. Mai 2009, 14:39
von numerix
Lektüre-Tipp zum Grundverständnis von Tkinter: http://www.ferg.org/thinking_in_tkinter ... grams.html

Verfasst: Mittwoch 6. Mai 2009, 14:43
von egerlach
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?

Verfasst: Mittwoch 6. Mai 2009, 14:53
von numerix

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!

Verfasst: Mittwoch 6. Mai 2009, 15:24
von egerlach
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?

Verfasst: Mittwoch 6. Mai 2009, 15:43
von numerix
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.

Verfasst: Mittwoch 6. Mai 2009, 16:11
von egerlach
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

Verfasst: Mittwoch 6. Mai 2009, 16:16
von yipyip
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

Verfasst: Mittwoch 6. Mai 2009, 16:22
von egerlach
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?

Verfasst: Mittwoch 6. Mai 2009, 16:41
von 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()