Python 键盘事件的监听为啥像这样总是出现未响应

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 键盘事件的监听为啥像这样总是出现未响应相关的知识,希望对你有一定的参考价值。

#代码如下
import sys, time, graphics

choice = ''
win = graphics.GraphWin("Test", 500, 500)

def ifContinue():
global choice
playing = True
while playing:
if choice == 'Q':
sys.exit(0)
if choice == 'S':
playing = False
time.sleep(0.1)

# Handle key press event
def handleKeys(event):
global choice

print('Key pressed', event.keysym, event.keycode)

if event.keysym == 's' or event.keysym == 'S':
choice = 'S'
if event.keysym == 'q' or event.keysym == 'Q':
choice = 'Q'

# Wait for events - key entry events
win.bind_all('<Key>', handleKeys)

while True:
ifContinue()

if choice == 'S':
print("You press 's'")

# Wait for events - main loop
win.mainloop()

你这里的time.sleep的时间太短的。 这个graphics库,本来就是为了入门的人学的。 它的界面是单线程的。 不支持很快速的响应。 更不适合做好游戏。

你可以考虑使用 pygame或者是pygtk,甚至 wxWin都比这个强。
参考技术A 你的代码不对,应该这样写,代码如下:

Python监听鼠标键盘事件

# -*- coding: utf-8 -*-
__author__ = P00113
# coding: utf-8

import pythoncom
import pyHook
import win32api
import win32con
import time
import threading
import random

VK_CODE = {
    backspace: 0x08,
    tab: 0x09,
    clear: 0x0C,
    enter: 0x0D,
    shift: 0x10,
    ctrl: 0x11,
    alt: 0x12,
    pause: 0x13,
    caps_lock: 0x14,
    esc: 0x1B,
    spacebar: 0x20,
    page_up: 0x21,
    page_down: 0x22,
    end: 0x23,
    home: 0x24,
    left_arrow: 0x25,
    up_arrow: 0x26,
    right_arrow: 0x27,
    down_arrow: 0x28,
    select: 0x29,
    print: 0x2A,
    execute: 0x2B,
    print_screen: 0x2C,
    ins: 0x2D,
    del: 0x2E,
    help: 0x2F,
    0: 0x30,
    1: 0x31,
    2: 0x32,
    3: 0x33,
    4: 0x34,
    5: 0x35,
    6: 0x36,
    7: 0x37,
    8: 0x38,
    9: 0x39,
    a: 0x41,
    b: 0x42,
    c: 0x43,
    d: 0x44,
    e: 0x45,
    f: 0x46,
    g: 0x47,
    h: 0x48,
    i: 0x49,
    j: 0x4A,
    k: 0x4B,
    l: 0x4C,
    m: 0x4D,
    n: 0x4E,
    o: 0x4F,
    p: 0x50,
    q: 0x51,
    r: 0x52,
    s: 0x53,
    t: 0x54,
    u: 0x55,
    v: 0x56,
    w: 0x57,
    x: 0x58,
    y: 0x59,
    z: 0x5A,
    numpad_0: 0x60,
    numpad_1: 0x61,
    numpad_2: 0x62,
    numpad_3: 0x63,
    numpad_4: 0x64,
    numpad_5: 0x65,
    numpad_6: 0x66,
    numpad_7: 0x67,
    numpad_8: 0x68,
    numpad_9: 0x69,
    multiply_key: 0x6A,
    add_key: 0x6B,
    separator_key: 0x6C,
    subtract_key: 0x6D,
    decimal_key: 0x6E,
    divide_key: 0x6F,
    F1: 0x70,
    F2: 0x71,
    F3: 0x72,
    F4: 0x73,
    F5: 0x74,
    F6: 0x75,
    F7: 0x76,
    F8: 0x77,
    F9: 0x78,
    F10: 0x79,
    F11: 0x7A,
    F12: 0x7B,
    F13: 0x7C,
    F14: 0x7D,
    F15: 0x7E,
    F16: 0x7F,
    F17: 0x80,
    F18: 0x81,
    F19: 0x82,
    F20: 0x83,
    F21: 0x84,
    F22: 0x85,
    F23: 0x86,
    F24: 0x87,
    num_lock: 0x90,
    scroll_lock: 0x91,
    left_shift: 0xA0,
    right_shift : 0xA1,
    left_control: 0xA2,
    right_control: 0xA3,
    left_menu: 0xA4,
    right_menu: 0xA5,
    browser_back: 0xA6,
    browser_forward: 0xA7,
    browser_refresh: 0xA8,
    browser_stop: 0xA9,
    browser_search: 0xAA,
    browser_favorites: 0xAB,
    browser_start_and_home: 0xAC,
    volume_mute: 0xAD,
    volume_Down: 0xAE,
    volume_up: 0xAF,
    next_track: 0xB0,
    previous_track: 0xB1,
    stop_media: 0xB2,
    play/pause_media: 0xB3,
    start_mail: 0xB4,
    select_media: 0xB5,
    start_application_1: 0xB6,
    start_application_2: 0xB7,
    attn_key: 0xF6,
    crsel_key: 0xF7,
    exsel_key: 0xF8,
    play_key: 0xFA,
    zoom_key: 0xFB,
    clear_key: 0xFE,
    +: 0xBB,
    ,: 0xBC,
    -: 0xBD,
    .: 0xBE,
    /: 0xBF,
    `: 0xC0,
    ;: 0xBA,
    [: 0xDB,
    \\: 0xDC,
    ]: 0xDD,
    "": 0xDE,
    `: 0xC0}


def key_press(key=‘‘):
    if key != ‘‘ and isinstance(key, str):
        if key.__len__() == 1:
            win32api.keybd_event(VK_CODE[key], 0, 0, 0)
            print press key down:%s % VK_CODE[key]
        else:
            for x in key:
                win32api.keybd_event(VK_CODE[x], 0, 0, 0)


def key_up(key=‘‘):
    if key != ‘‘ and isinstance(key, str):
        if key.__len__() == 1:
            win32api.keybd_event(VK_CODE[key], 0, win32con.KEYEVENTF_KEYUP, 0)
            print press key up:%s % VK_CODE[key]
        else:
            for x in key:
                win32api.keybd_event(VK_CODE[x], 0, win32con.KEYEVENTF_KEYUP, 0)


def send_click():
    global down_num, up_num
    while (1):
        if down_num != up_num:
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
            # 连射多少秒,大约0.1秒一发子弹
            time.sleep(random.uniform(0.38, 0.42))
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
            # 连发之间的停顿时间
            time.sleep(random.uniform(0.25, 0.29))
            key_press(2)
            key_up(2)
            time.sleep(random.uniform(0.38, 0.56))
            key_press(1)
            key_up(1)
            print click ok


def onMouse_leftdown(event):
    # 监听鼠标左键按下事件
    global down_num
    down_num += 1
    print "left DOWN DOWN" + str(down_num)
    return True
    # 返回 True 表示响应此事件,False表示拦截


def onMouse_leftup(event):
    # 监听鼠标左键弹起事件
    global up_num
    up_num += 1
    print "left UP UP UP" + str(up_num)
    return True


def keybord_1(event):
    pass


def main():
    hm = pyHook.HookManager()

    hm.MouseLeftDown = onMouse_leftdown
    hm.MouseLeftUp = onMouse_leftup

    hm.HookMouse()

    # 进入循环,如不手动关闭,程序将一直处于监听状态
    pythoncom.PumpMessages()


if __name__ == "__main__":
    down_num = 0
    up_num = 0
    # 新线程执行的代码:
    print(thread %s is running... % threading.current_thread().name)
    t = threading.Thread(target=send_click, name=sendThread)
    t.start()
    # t.join()
    main()

 

# -*- coding: utf-8 -*-
__author__ = P00113
# coding: utf-8

import pythoncom
import pyHook
import win32api
import win32con
import time
import threading
import random

VK_CODE = {
    backspace: 0x08,
    tab: 0x09,
    clear: 0x0C,
    enter: 0x0D,
    shift: 0x10,
    ctrl: 0x11,
    alt: 0x12,
    pause: 0x13,
    caps_lock: 0x14,
    esc: 0x1B,
    spacebar: 0x20,
    page_up: 0x21,
    page_down: 0x22,
    end: 0x23,
    home: 0x24,
    left_arrow: 0x25,
    up_arrow: 0x26,
    right_arrow: 0x27,
    down_arrow: 0x28,
    select: 0x29,
    print: 0x2A,
    execute: 0x2B,
    print_screen: 0x2C,
    ins: 0x2D,
    del: 0x2E,
    help: 0x2F,
    0: 0x30,
    1: 0x31,
    2: 0x32,
    3: 0x33,
    4: 0x34,
    5: 0x35,
    6: 0x36,
    7: 0x37,
    8: 0x38,
    9: 0x39,
    a: 0x41,
    b: 0x42,
    c: 0x43,
    d: 0x44,
    e: 0x45,
    f: 0x46,
    g: 0x47,
    h: 0x48,
    i: 0x49,
    j: 0x4A,
    k: 0x4B,
    l: 0x4C,
    m: 0x4D,
    n: 0x4E,
    o: 0x4F,
    p: 0x50,
    q: 0x51,
    r: 0x52,
    s: 0x53,
    t: 0x54,
    u: 0x55,
    v: 0x56,
    w: 0x57,
    x: 0x58,
    y: 0x59,
    z: 0x5A,
    numpad_0: 0x60,
    numpad_1: 0x61,
    numpad_2: 0x62,
    numpad_3: 0x63,
    numpad_4: 0x64,
    numpad_5: 0x65,
    numpad_6: 0x66,
    numpad_7: 0x67,
    numpad_8: 0x68,
    numpad_9: 0x69,
    multiply_key: 0x6A,
    add_key: 0x6B,
    separator_key: 0x6C,
    subtract_key: 0x6D,
    decimal_key: 0x6E,
    divide_key: 0x6F,
    F1: 0x70,
    F2: 0x71,
    F3: 0x72,
    F4: 0x73,
    F5: 0x74,
    F6: 0x75,
    F7: 0x76,
    F8: 0x77,
    F9: 0x78,
    F10: 0x79,
    F11: 0x7A,
    F12: 0x7B,
    F13: 0x7C,
    F14: 0x7D,
    F15: 0x7E,
    F16: 0x7F,
    F17: 0x80,
    F18: 0x81,
    F19: 0x82,
    F20: 0x83,
    F21: 0x84,
    F22: 0x85,
    F23: 0x86,
    F24: 0x87,
    num_lock: 0x90,
    scroll_lock: 0x91,
    left_shift: 0xA0,
    right_shift : 0xA1,
    left_control: 0xA2,
    right_control: 0xA3,
    left_menu: 0xA4,
    right_menu: 0xA5,
    browser_back: 0xA6,
    browser_forward: 0xA7,
    browser_refresh: 0xA8,
    browser_stop: 0xA9,
    browser_search: 0xAA,
    browser_favorites: 0xAB,
    browser_start_and_home: 0xAC,
    volume_mute: 0xAD,
    volume_Down: 0xAE,
    volume_up: 0xAF,
    next_track: 0xB0,
    previous_track: 0xB1,
    stop_media: 0xB2,
    play/pause_media: 0xB3,
    start_mail: 0xB4,
    select_media: 0xB5,
    start_application_1: 0xB6,
    start_application_2: 0xB7,
    attn_key: 0xF6,
    crsel_key: 0xF7,
    exsel_key: 0xF8,
    play_key: 0xFA,
    zoom_key: 0xFB,
    clear_key: 0xFE,
    +: 0xBB,
    ,: 0xBC,
    -: 0xBD,
    .: 0xBE,
    /: 0xBF,
    `: 0xC0,
    ;: 0xBA,
    [: 0xDB,
    \\: 0xDC,
    ]: 0xDD,
    "": 0xDE,
    `: 0xC0}


def key_press(key=‘‘):
    if key != ‘‘ and isinstance(key, str):
        if key.__len__() == 1:
            win32api.keybd_event(VK_CODE[key], 0, 0, 0)
            print press key down:%s % VK_CODE[key]
        else:
            for x in key:
                win32api.keybd_event(VK_CODE[x], 0, 0, 0)


def key_up(key=‘‘):
    if key != ‘‘ and isinstance(key, str):
        if key.__len__() == 1:
            win32api.keybd_event(VK_CODE[key], 0, win32con.KEYEVENTF_KEYUP, 0)
            print press key up:%s % VK_CODE[key]
        else:
            for x in key:
                win32api.keybd_event(VK_CODE[x], 0, win32con.KEYEVENTF_KEYUP, 0)


def send_click():
    global down_num, up_num
    while (1):
        if down_num != up_num:
            win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
            time.sleep(random.uniform(0.28, 0.32))
            win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0)
            time.sleep(random.uniform(0.18, 0.22))
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
            # 连射多少秒,大约0.1秒一发子弹
            time.sleep(random.uniform(0.38, 0.42))
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
            # 连发之间的停顿时间
            time.sleep(random.uniform(0.25, 0.29))
            key_press(2)
            key_up(2)
            time.sleep(random.uniform(0.68, 0.86))
            key_press(1)
            key_up(1)
            print click ok


def onMouse_rightdown(event):
    # 监听鼠标右键按下事件
    # global down_num
    # down_num += 1
    print "right DOWN DOWN" + str(down_num)
    return True

def onMouse_rightup(event):
    # 监听鼠标左键弹起事件
    # global up_num
    # up_num += 1
    print "left UP UP UP" + str(up_num)
    return True

def onMouse_leftdown(event):
    # 监听鼠标左键按下事件
    global down_num
    down_num += 1
    print "left DOWN DOWN" + str(down_num)
    return True
    # 返回 True 表示响应此事件,False表示拦截


def onMouse_leftup(event):
    # 监听鼠标左键弹起事件
    global up_num
    up_num += 1
    print "left UP UP UP" + str(up_num)
    return True



def main():
    hm = pyHook.HookManager()
    hm.Mouseright = onMouse_rightdown
    hm.MouseLeftDown = onMouse_leftdown
    hm.MouseLeftUp = onMouse_leftup
    hm.HookMouse()

    # 进入循环,如不手动关闭,程序将一直处于监听状态
    pythoncom.PumpMessages()


if __name__ == "__main__":
    down_num = 0
    up_num = 0
    # 新线程执行的代码:
    print(thread %s is running... % threading.current_thread().name)
    t = threading.Thread(target=send_click, name=sendThread)
    t.start()
    # t.join()
    main()

 

以上是关于Python 键盘事件的监听为啥像这样总是出现未响应的主要内容,如果未能解决你的问题,请参考以下文章

Python gtk3 窗口监听输入事件

Python 键盘监听器

unity打包webgl程序和js键盘监听事件冲突的问题。

为啥我的事件监听器没有在 laravel 5 中触发?

Python监听鼠标键盘事件

python 监听键盘事件