Keycode für Strg+C und Strg+V

Plattformunabhängige GUIs mit wxWidgets.
Antworten
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Freitag 20. Juni 2008, 11:47

Hallo!

Wie definiert man den Keycode für Strg+C und Strg+V? Wenn ich das in der wx Demo ausprobiere, erhalte ich 22 und 3. Das funktioniert aber bei Abfragen (if event.keycode() == 22) nicht... Wenn ich mir einfach den Keycode print'en lasse, erhalte ich nur die Codes für die einzelnen Tasten aber nicht für die jeweilige Kombination.

Kann jemand helfen?

Liebe Grüsse
Stefanie
http://www.snowflake-sl.info/index.html
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Freitag 20. Juni 2008, 12:41

Hast Du es schon mit event.GetKeyCode() probiert? Damit müsste es nach der Demo über KeyEvents eigentlich funktionieren.
MfG
HWK
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Freitag 20. Juni 2008, 12:57

Sorry hatte mich verschrieben, ich meinte GetKeyCode().
Geht nicht...Bekomme im Interpreter nur die Codes der einzelnen Tasten und in der Demo Code 3 für strg+c und 22 für strg+v.

Code: Alles auswählen

if event.GetKeyCode() ==3:
    bla
Tut sich nichts...Kontrolle funktioniert super (z.B. mit Taste 1)
http://www.snowflake-sl.info/index.html
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Samstag 21. Juni 2008, 15:44

Was bedeuten 'Interpreter' (etwa Idle?) und 'Kontrolle funktioniert super'? Könntest Du etwas mehr Code zeigen?
MfG
HWK

Edit: Ich habe es jetzt einmal mit einem Minimalprogramm ausprobiert. Bei mir funktioniert alles tadellos. Wenn es bei Dir immer noch nicht laufen sollte, musst Du mehr Informationen, insbesondere Code liefern.
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Mittwoch 25. Juni 2008, 10:51

ok:

Code: Alles auswählen

def OnKey(self, event):
        print event.GetKeyCode()
        if event.GetKeyCode() == 49:
            print "one"
            self.selection()
            self.copy()
    
        if event.GetKeyCode() == 50:
            print "two"
            self.selection()
            self.paste()       

        # Skip other Key events
        if event.GetKeyCode():
            event.Skip()
            return
http://www.snowflake-sl.info/index.html
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Mittwoch 25. Juni 2008, 11:00

ok, hier ein Auszug:

Code: Alles auswählen

def OnKey(self, event):
        print event.GetKeyCode()
        if event.GetKeyCode() == 49:
            print "one"
            self.selection()
            self.copy()
    
        elif event.GetKeyCode() == 50:
            print "two"
            self.selection()
            self.paste()       

        elif event.GetKeyCode():
            event.Skip()
            return


1) print event.GetKeyCode() gibt im Idle wenn ich strg+v drücke nur die Codes der einzelnen Tasten aus (308 für strg und 86 für v)
2) Wenn ich 1 oder 2 drücke (Keycode 49 bzw. 50) funktioniert alles und er fürt self.copy und self.paste aus.
3) Wenn ich in der wxDemo das Keyevent Beispiel ausprobiere, erhalte ich für strg+v als char 22. Setze ich dieses aber in der keycode Abfrage anstatt 49 ein, also

Code: Alles auswählen

if event.GetKeyCode() == 22:
            print "ok"
            self.selection()
            self.copy()
...wird self.copy nicht ausgeführt...

Ich hoffe das war verständlicher!
Stefanie
Zuletzt geändert von ete am Mittwoch 25. Juni 2008, 11:14, insgesamt 1-mal geändert.
http://www.snowflake-sl.info/index.html
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mittwoch 25. Juni 2008, 11:03

"elif" und "else" sind hier angebracht ;-) Und wenn die Methode nicht noch weiter geht, dann ist das return etwas seltsam.

Wenn du das "self.selection()" in "copy" und "past" hineinziehst (und die Methode nicht länger ist), dann geht es noch etwas kürzer:

Code: Alles auswählen

{49:self.copy, 50:self.paste}.get(event.GetKeyCode(), event.Skip)()
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Mittwoch 25. Juni 2008, 11:13

Ja, klar hab mich vertippt und es geht noch weiter:D
Hab's editiert :P
EyDu hat geschrieben:

Code: Alles auswählen

{49:self.copy, 50:self.paste}.get(event.GetKeyCode(), event.Skip)()
Diese Schreibart ist irgendwie nicht mein Ding...
http://www.snowflake-sl.info/index.html
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Mittwoch 25. Juni 2008, 12:41

Das Problem dürfte wie so oft Idle sein. Läuft es denn in der Konsole?
Dies ist mein Testscript:

Code: Alles auswählen

import wx

class MyPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)
        tc = wx.TextCtrl(self, -1, 'Dummy', size=(125, -1))
        tc.Bind(wx.EVT_CHAR, self.on_char)

    def on_char(self, event):
        keycode = event.GetKeyCode()
        modifiers = ''
        for mod, ch in [(event.ControlDown(), 'C'),
                        (event.AltDown(),     'A'),
                        (event.ShiftDown(),   'S'),
                        (event.MetaDown(),    'M')]:
            if mod:
                modifiers += ch
            else:
                modifiers += '-'
        print keycode, modifiers
        if keycode == 22:
            print 'String-V'
        elif keycode == 3:
            print 'String-C'

def main():
    app = wx.PySimpleApp(False)
    frame = wx.Frame(None, -1, 'Titel', size=(500, 500))
    panel = MyPanel(frame)
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()
Es funktioniert problemlos sowohl in der Konsole als auch (wohl zufälligerweise) in Idle.
MfG
HWK
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Mittwoch 25. Juni 2008, 13:16

Ok, in der Konsole geht's...Mein Script, sowie auch deines.
Vielen Dank!
http://www.snowflake-sl.info/index.html
Antworten