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

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

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

Beitragvon egerlach » Mittwoch 6. Mai 2009, 14:15

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: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Mittwoch 6. Mai 2009, 14:27

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

Beitragvon numerix » Mittwoch 6. Mai 2009, 14:39

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

Beitragvon egerlach » Mittwoch 6. Mai 2009, 14:43

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

Beitragvon numerix » Mittwoch 6. Mai 2009, 14:53

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

Beitragvon egerlach » Mittwoch 6. Mai 2009, 15:24

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

Beitragvon numerix » Mittwoch 6. Mai 2009, 15:43

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

Beitragvon egerlach » Mittwoch 6. Mai 2009, 16:11

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

Beitragvon yipyip » Mittwoch 6. Mai 2009, 16:16

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

Beitragvon egerlach » Mittwoch 6. Mai 2009, 16:22

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

Beitragvon BlackJack » Mittwoch 6. Mai 2009, 16:41

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()

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder