【问题标题】:How to pause a while loop until a certain key is pressed?如何暂停while循环,直到按下某个键?
【发布时间】:2021-05-26 07:18:39
【问题描述】:

我希望在您按 xbutton1 时暂停点击,并在按 xbutton2 时继续点击。

这是我的代码:

import win32api
import win32con
import pyautogui

click = True


def clicking():
    get = win32api.GetKeyState(win32con.VK_LBUTTON)
    if get < 1:
        pyautogui.click()


def stop():
    if win32api.GetKeyState(win32con.VK_XBUTTON1):
        click = False


def continue_program():
    if win32api.GetKeyState(win32con.VK_XBUTTON2):
        click = True


while True:
    if click == True:
        clicking()

    else:
        stop()

【问题讨论】:

  • 您可以在while循环开始时检查2个按钮的点击状态以确认暂停或继续,如果resutl是暂停,您的while循环应该使用continue来传递循环代码。
  • @ElapsedSoul 我是编码新手,所以我不完全理解这一点,所以如果你能将我的代码更改为它应该如何工作,那就太好了。非常感谢

标签: python winapi while-loop pyautogui win32con


【解决方案1】:
import win32api
import win32con
import pyautogui

click = True


def clicking():
    get = win32api.GetKeyState(win32con.VK_LBUTTON)
    if get < 1:
        pyautogui.click()


def check():
    if win32api.GetKeyState(win32con.VK_XBUTTON1):
        click = False
    if win32api.GetKeyState(win32con.VK_XBUTTON2):
        click = True
    # Actually, here still has some contitions to check.
    return click


while True:
    if not check():
        continue
    # The things you want the loop to do. 
    clicking()

【讨论】:

  • 我不确定你的代码的真正含义,我猜这个代码可能是你想要的,你可以检查它是否是你想要的。如果没有,请将您的评论添加给我。
  • GetKeyState: ""当线程从其消息队列中读取关键消息时,此函数返回的关键状态会发生变化。"* 呈现的代码不会从其消息队列中读取消息。因此,它无法观察同步键状态。
  • @llnspectable 我对这些 api 了解不多。我只是讲逻辑。思想比技巧更重要。您的评论是另一个问题,我已经在我的代码中提到了 # Actually, here still has some contitions to check. 。我们知道键盘输入/输出事件必须是异步的,而他的代码是同步的。
  • 从同步输入处理切换到异步输入处理为偶尔/经常失败的解决方案交换了一个强大的解决方案。 Windows 上强大的输入处理意味着切换到基于事件的范例。对于许多习惯于编写严格线性的代码的 Python 开发人员来说,这是一个艰难的转变。
  • @IInspectable 发帖者询问他对暂停循环的疑问。我只是给出这个答案,因为我不熟悉这些api。也许你可以给他一个解决你提到的错误的方法。
猜你喜欢
  • 1970-01-01
  • 2017-07-03
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
相关资源
最近更新 更多