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
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
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
Tja, Alzheimer, das Alter, ....
Habe mich immerhin daran erinnert, als die Lösung kam. Nicht schlecht, oder?
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()