试图使用pyautogui.press'volumemute'使系统静音,但是它什么也没做 发现错误:修改代码:

问题描述

简单的代码,不起作用,还有什么需要做的吗? 这只是一个测试,我只想知道'volumemute'是否有效,其他特殊键(如“ capslock”和“ volumeup”)也不起作用。 “ volumemute”在做什么?会使系统静音吗?本来希望看到Mac的小音量窗口,但它也不会静音,例如,Firefox上的youtube视频...

import pyautogui
import time

confirm_window = pyautogui.alert()
if confirm_window == 'OK':
    time.sleep(1)
    pyautogui.press('volumemute')       # Does not work
    pyautogui.press('a')                # Does work
    pyautogui.press('b')                # Does work

我已经尝试过此link上的解决方案,如果我将Phylliida的解决方案或kenorb的解决方案复制到新文件上,并调用相同示例的KeyPress(),则会发生相同的结果。

我还在pyautogui的github页面上看到mojave出现了权限问题,即使它不影响我,我还是在Accessibility中的列表中添加了PyCharm,Python Launcher和Terminal, image, 我希望能够在按下一个按钮同时执行其他操作(例如将光标移动到特定坐标等)时降低脚本中的音量。 另外,在2011年初的Macbook上,我可以升级OS达到最高水平

非常感谢

解决方法

嗯,这需要花点时间才能弄清楚。 :-)

发现错误:

事实证明pyautogui的众多问题之一是2015年以来的一个问题,抱怨press is not working for all keys in macOS,它已经在pull #213中提出了部分(!!)解决方案。在这种特定情况下,原始代码使用两个连续的if … 语句而不是if … elif …来使代码中断。

如果您在GitHub上检查代码,则会发现.press()方法是defined in init.py来引用依赖于平台的_keyup()_keydown() {{3 }}。如果您从function calls defined here for macOS手动应用此修复程序,则仍然需要修复另一件事,

Pyautogui使用_keyup()_keydown()中的所有行:

if key in special_key_translate_table:

但在执行此行之前,由于pull #213,“ key”已转换为小写字母:

if len(key) > 1:
    key = key.lower()

special_key_translate_table this line in init.py的词典使用大写字母,例如“ KEYTYPE_MUTE”,因此查找将无法正常工作!

修改代码:

首先,确定pyautogui代码在您的安装中的位置(即,确定站点软件包的安装位置)。最简单的方法是运行以下代码:

from pyautogui import press
press()

这应该引发如下错误消息:

Traceback (most recent call last):
  File "pyautogui_test_2.py",line 6,in <module>
    press()
  File "/path/to/the/python/site-packages/pyautogui/__init__.py",line 586,in wrapper
    returnVal = wrappedFunction(*args,**kwargs)
TypeError: press() missing 1 required positional argument: 'keys'

请注意,Traceback中的路径取决于您的安装,现在转到打开站点包(即“ / path / to / the / python / site-packages / pyautogui /”)中的pyautogui文件夹,然后在其中,将第219行附近的文件“ _pyautogui_osx.py”编辑为此:

def _keyDown(key):
    if key.upper() in special_key_translate_table:
        _specialKeyEvent(key.upper(),'down')
    elif key not in keyboardMapping or keyboardMapping[key] is None:
        return    
    else:
        _normalKeyEvent(key,'down')

def _keyUp(key):
    if key.upper() in special_key_translate_table:
        _specialKeyEvent(key.upper(),'up')
    elif key not in keyboardMapping or keyboardMapping[key] is None:
        return
    else:
        _normalKeyEvent(key,'up')

既包含上述拉动#213的修复,也包含使用key.upper()的更正查找功能。现在,您应该能够使用上述special_key_translate_table 字典中的所有键,例如通过在脚本中调用press(u'KEYTYPE_MUTE')使系统音量静音。

请注意,所有特殊的键码也都在defined here上定义。