Почему win32api не может сканировать ключи после того, как filedialog был использован в Python 3? - PullRequest
1 голос
/ 17 апреля 2019

После использования «AskDirectory» из Tkinter в Python 3 я win32api.GetKeyState () не работает.

Привет!

В Python 3 я пытаюсь поймать нажатые клавиши, чтобы выполнить несколько действий в моем инструменте. Логика выглядит так: 1. Я выбираю папку для сохранения результатов. 2. Я ловлю нажатия клавиш и выполняю некоторые действия. 3. Сохраняю результаты в папке.

Для выбора папки я использую «askdirectory» из tkinter. Для сканирования ключей я использую win32api.GetKeyState ()

Когда я пытаюсь сканировать ключи без вызова askdirectory, все работает нормально. Если я вызываю askdirectory и затем пытаюсь сканировать ключи, win32api.GetKeyState () показывает статические результаты. Кажется, что win32api больше не может получать результаты.

Может кто-нибудь помочь мне решить проблему?

Код ниже не работает на моей машине. Если я сделаю комментарий "folder = filedialog.askdirectory (title =" Tilte ")" - все прекрасно работает.

Заранее спасибо.

import time
import tkinter
from tkinter import filedialog
def scan_keys():
    import win32api

    roll = True
    base_left_mouse = win32api.GetKeyState(0x01)
    base_shift = win32api.GetKeyState(0x10)
    base_ctrl = win32api.GetKeyState(0x11)
    base_alt = win32api.GetKeyState(0x12)
    base_p = win32api.GetKeyState(0x50)

    while roll:
        print("Scanning keys")
        print(base_left_mouse, base_shift, base_ctrl, base_alt, base_p)
        left_mouse = win32api.GetKeyState(0x01)
        shift = win32api.GetKeyState(0x10)
        ctrl = win32api.GetKeyState(0x11)
        alt = win32api.GetKeyState(0x12)
        p = win32api.GetKeyState(0x50)
        if (alt<0 and p!=base_p):
            print("ALT + P is pressed")

        elif (ctrl<0 and alt<0 and p!=base_p):
            print("Gathering complete")
            roll = False

        base_left_mouse = win32api.GetKeyState(0x01)
        base_shift = win32api.GetKeyState(0x10)
        base_ctrl = win32api.GetKeyState(0x11)
        base_alt = win32api.GetKeyState(0x12)
        base_p = win32api.GetKeyState(0x50)
        print("Scanning base keys")
        time.sleep(1)

root=tkinter.Tk()
root.withdraw()
folder = filedialog.askdirectory(title="Tilte")
print(folder)
scan_keys()
root.mainloop()

1 Ответ

0 голосов
/ 18 апреля 2019

Результат GetKeyState зависит от текущей очереди сообщений,

сообщает о состоянии клавиатуры на основе ваших сообщений извлекается из очереди ввода.

(от Старая новая вещь )

Если текущая очередь сообщений была изменена, ключевое сообщение будет отправлено в новую очередь, а сообщение в старой будет недействительным (если вы не вернетесь в старую очередь).

GetAsyncKeyState возвращает состояние, отражающее состояние уровня прерывания, связанное с оборудованием. И вам также нужно игнорировать младший значащий бит:

base_x = win32api.GetKeyState(key)&0x8000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...