微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法让 python、pyautogui 和 kivy 一起工作

如何解决无法让 python、pyautogui 和 kivy 一起工作

几周前开始学习python,所以可能是一个菜鸟问题,但是...... 当我在 Windows 10 上运行此代码时:

# code 1
import pyautogui


janela = pyautogui.getwindowsWithTitle('Google Chrome')
janela[0].activate()

它聚焦所需的窗口....我可以最大化、关闭、最小化等..with pyautogui

但是如果我尝试分配给一个 kivy 按钮,我会收到一个错误

# code 2 py file

from kivy.app import App
from kivy.uix.Boxlayout import BoxLayout
import pyautogui


class atest(App):
   def build(self):
       a = bs()
       return a


class bs(BoxLayout):
   def roda(self):
       janela = pyautogui.getwindowsWithTitle('Google Chrome')
       janela[0].activate()


ja = atest()
ja.run()
#code 2 kv file

<bs>:
    Button:
        on_press: root.roda()

它呈现按钮,但在点击时:

ctypes.ArgumentError: argument 2: <class 'TypeError'>: expected LP_RECT instance instead of pointer to RECT

一开始我以为是 pyautogui 的问题,所以我用代码 1 进行了测试并且它有效,然后我认为这是我的应用程序的问题,所以我用代码 2 进行了测试,因为我得到了一个简单的按钮有问题,也许我没有用正确的方式调用它..

遵循此处的建议:https://github.com/asweigart/pyautogui/issues/353 但我认为这是一个不同的问题。

edit: All methods in pyautogui work except the ones related to pygetwindow (getAllWindows(),getwindowsWithTitle('Untitled'),getActiveWindow(),getActiveWindow().title)

edit2: if I change the function called by the button so it runs code1 it works as expected..

def roda(self):
        os.system(r"C:\Users\tetsuo\anaconda3\envs\k37\python.exe " "code1.py ")

解决方法

因此,放弃使用 pyautogui 聚焦窗口并使用 pywinauto:

from pywinauto.application import Application
def roda(self): 
    app = Application()
    app.connect(title_re=".*Chrome")
    app_dialog = app.top_window()
    app_dialog.set_focus()
,

我遇到了类似的问题,并且相信我找到了解决方案。

看起来 pywinauto 有类似的问题,因为我从他们的 github 问题页面找到了解决方案的链接。

在此页面上:https://bugs.python.org/issue22552

ctypes 全局 LibraryLoader 实例对于 Windows 脚本和应用程序很方便。实际上他们缓存的是库(一个 CDLL 实例),它依次缓存函数指针。

另一方面,Python 包不应该使用这些特定的加载器。正如您所经历的那样,这样做会导致 restype、argtypes 和 errcheck 的定义发生冲突。而是创建一个私有加载器,例如 cdll = LibraryLoader(CDLL) 或 windll = LibraryLoader(WinDLL)。

在非 Windows 平台上这样做几乎毫无意义。为了获得缓存的好处,您必须使用诸如 cdll['libc.so.6'] 之类的下标。使用 libc = CDLL('libc.so.6') 更简单。

因此编辑 pyautogui 源文件 _pygetwindow_win.py 以包含在顶部

windll = ctypes.LibraryLoader(ctypes.WinDLL)

然后将所有对 ctypes.windll... 的调用更改为引用您刚刚创建的 windll 变量。我想这更像是 pygetwindow 中的一个错误,而不是 pyautogui

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。