Tastaturzahlen

Fragen zu Tkinter.
Antworten
Yutorimoyasi
User
Beiträge: 1
Registriert: Donnerstag 19. April 2018, 20:15

Hi, ich habe letztens angefangen mit Tkinter ein bissen herum zu experimentieren. Ich wollte einen Button machen, der entweder durch Drücken der linken Maustaste aktiviert wird, oder durch das Drücken von einer(im Bsp 1) Zahl auf der Tastatur. 1. Funktionieren mehrere Zuweisungen? 2. Wie sind die Zahlen auf der Tastatur definiert?

(so, oder so ähnlich, denk ich mir)
button1.bind('<Button-1> <Tastatur-1>',<funktion>)

Danke im Vorraus :D
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Yutorimoyasi: Für die Maustaste ist das `command`-Argument da. Du kannst auch Tastaturereignisse binden, allerdings muss dazu das jeweilige Element den Fokus haben. Du möchtest das also eher nicht an die einzelnen Schaltflächen binden, denn dazu müsste man die vorher auswählen, sondern an ein Container-Widget wo alle Zahlenschaltflächen enthalten sind, oder eventuell sogar an das Fenster in dem das dargestellt wird.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
ebs55
User
Beiträge: 17
Registriert: Sonntag 29. April 2018, 14:27

Als ich so was ähnliches ausprobiert habe, bin ich zu folgender Funktion geraten:

Das Ganze spielte sich innerhalb einer Klasse ab; deshalb ist das "self" mit drin
(das ist der Bezug zu der eigenen Klasse).
Ohne Klasse muss es entfernt werden!

Code: Alles auswählen

    def keyPressEvent(self, e):
        zch = e.key()
        if zch == Qt.Key_Escape: 
            print('Esc wurde gedrückt')
            self.close()
            # repl = QMessageBox(YesNoCancel,'wirklich beenden' )
        elif zch == Qt.Key_Space:
            print('<Space>  gedrückt')        
        elif zch == Qt.Key_Backspace:
            print('<Backspace>  gedrückt')        
        # elif zch == Qt.Key_Less:
        #     print('<Kleiner>  gedrückt')

        elif zch == Qt.Key_Right:
            print('<Pfeil rechts>  gedrückt')
        elif zch == Qt.Key_Left:
            print('< Pfeil links >  gedrückt')
        elif zch == Qt.Key_Up:
            print('<Pfeil-up>  gedrückt')
        elif zch == Qt.Key_Down:
            print('<Pfeil-down>  gedrückt')
        elif zch == Qt.Key_Enter:
            print('<Enter>  gedrückt')
        else:
            if len(str(zch)) == 2:
                print(f'es wurde {chr(e.key())} gedrückt. ')
Viel Erfolg damit!
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ebs55: Ich denke im Tkinter-Unterforum wird eine Antwort für Qt nicht sooo viel bringen. ;-)

Und auch hier sind die Abkürzungen nicht gut. `e` sollte `event` heissen und bei `zch` würde ich mal `zeichen` raten, aber eben das ist es ja gerade: man sollte nicht raten müssen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hier mal ein einfaches Tastenfeld, das man mit Maus und Tastatur bedienen kann:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8
from __future__ import absolute_import, division, print_function

from functools import partial
import Tkinter as tk


class NumberPad(tk.Frame):
    
    def __init__(self, master, on_key=None):
        tk.Frame.__init__(self, master)
        character2keysym = {
            '#': 'numbersign',
            '*': 'asterisk',
        }
        for i, row in enumerate(['789', '456', '123', '*0#']):
            for j, character in enumerate(row):
                command = partial(on_key, character)
                button = tk.Button(self, text=character, command=command)
                button.grid(row=i, column=j)
                keysym = character2keysym.get(character, character)
                self.bind(
                    '<KeyPress-{}>'.format(keysym),
                    partial(lambda f, _: f(), command),
                )


def main():
    root = tk.Tk()
    root.title('Number Pad')
    
    label = tk.Label(root)
    label.pack()
    
    pad = NumberPad(root, lambda character: label.config(text=character))
    pad.pack()
    pad.focus()
    
    root.mainloop()
            

if __name__ == '__main__':
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten