6

私はバインディングの構文をよく知っていて使用していますが、代わりにイベント オブジェクトを直接チェックし、押された文字 (たとえば 'c') と修飾子 (e,g,'Control' および 'Alt') の両方を抽出するにはどうすればよいでしょうか?

私はこれを試しました

def reportEvent(event):
        eventDict = {
                '2': 'KeyPress', '3': 'KeyRelease', '4': 'ButtonPress', '5': 'ButtonRelease', '6': 'Motion', '7': 'Enter',
                '8': 'Leave', '9': 'FocusIn', '10': 'FocusOut', '12': 'Expose', '15': 'Visibility', '17': 'Destroy',
                '18': 'Unmap', '19': 'Map', '21': 'Reparent', '22': 'Configure', '24': 'Gravity', '26': 'Circulate',
                '28': 'Property', '32': 'Colormap','36': 'Activate', '37': 'Deactivate'}

        rpt = '\n\n%s' % (80*'=')
        rpt = '%s\nEvent: type=%s (%s)' % (rpt, event.type,eventDict.get(event.type, 'Unknown'))
        rpt = '%s\ntime=%s' % (rpt, event.time)
        rpt = '%s widget=%s' % (rpt, event.widget)
        rpt = '%s x=%d, y=%d'% (rpt, event.x, event.y)
        rpt = '%s x_root=%d, y_root=%d' % (rpt, event.x_root, event.y_root)
        rpt = '%s y_root=%d' % (rpt, event.y_root)
        rpt = '%s\nserial=%s' % (rpt, event.serial)
        rpt = '%s num=%s' % (rpt, event.num)
        rpt = '%s height=%s' % (rpt, event.height)
        rpt = '%s width=%s' % (rpt, event.width)
        rpt = '%s keysym=%s' % (rpt, event.keysym)
        rpt = '%s ksNum=%s' % (rpt, event.keysym_num)
        #### Some event types don't have these attributes
        try:
                rpt = '%s focus=%s' % (rpt, event.focus)
        except:
                try:
                        rpt = '%s send=%s' % (rpt, event.send_event)
                except:
                        pass
        print rpt

Python と Tkinter プログラミングに盗まれましたが、私が押している最終的な修飾子は表示されません

4

3 に答える 3

8

理論的には、これが問題の答えになります。

from tkinter import *

root = Tk()

mods = {
    0x0001: 'Shift',
    0x0002: 'Caps Lock',
    0x0004: 'Control',
    0x0008: 'Left-hand Alt',
    0x0010: 'Num Lock',
    0x0080: 'Right-hand Alt',
    0x0100: 'Mouse button 1',
    0x0200: 'Mouse button 2',
    0x0400: 'Mouse button 3'
}

root.bind( '<Key>', lambda e: print( 'Key:', e.char,
                                     'Mods:', mods.get( e.state, None )))

root.mainloop()

しかし、本来あるべきように機能していません。少なくとも、110キーのレイアウトである私のハンガリーのアップルキーボードでは機能していません..

とにかく、ここにイベント オブジェクトのすべてのプロパティがあります: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/event-handlers.html

于 2013-11-08T16:22:02.237 に答える
6

Peter Varoのアイデアの助けを借りて、私はそれをうまく機能させました(Windows 10とPython 3.4を実行しています)。

from tkinter import *

def onKeyDown(e):
    # The obvious information
    c = e.keysym
    s = e.state

    # Manual way to get the modifiers
    ctrl  = (s & 0x4) != 0
    alt   = (s & 0x8) != 0 or (s & 0x80) != 0
    shift = (s & 0x1) != 0

    # Merge it into an output
    # if alt:
    #     c = 'alt+' + c
    if shift:
        c = 'shift+' + c
    if ctrl:
        c = 'ctrl+' + c
    print(c)

# Run the tk window
root = Tk()
root.bind('<Key>', onKeyDown)
root.mainloop()

私のalt場合、キーはバグがあります(常に押されています)が、ctrlおよびはshift正常に機能します。

ctrlまたはキーを初めて押すshiftと、それはメイン キーとして登録されますが、修飾子としては登録されないことに注意してください。後でそれを保持する場合は、修飾子になります。

そのため、キーの組み合わせ ( など) として押す必要がありますCtrl+a。その結果、 を押してから を押すactrl、少し奇妙な結果が得られます (a を無視し、ctrl をメイン キーとしてマークしますが、モディファイアとしてはマークしません)。

于 2015-12-27T15:49:43.293 に答える