AttributeError:'module'对象在python中没有属性'windll'

Posted

技术标签:

【中文标题】AttributeError:\'module\'对象在python中没有属性\'windll\'【英文标题】:AttributeError: 'module' object has no attribute 'windll' in pythonAttributeError:'module'对象在python中没有属性'windll' 【发布时间】:2016-01-18 22:09:58 【问题描述】:

我正在尝试自动化 Web 应用程序。我应该单击一个链接,它会打开一个打印窗口。我无法在 selenium 自动化中实现这一点。所以我使用 ctypes 来像选项卡一样进行按键操作,输入关键事件。下面是我为实现这一目标而开发的库。我通过调用相应的方法来完成这些事件。

import ctypes
import time

SendInput = ctypes.windll.user32.SendInput

# C struct redefinitions 
PUL = ctypes.POINTER(ctypes.c_ulong)
class KeyBdInput(ctypes.Structure):
    _fields_ = [("wVk", ctypes.c_ushort),
                ("wScan", ctypes.c_ushort),
                ("dwFlags", ctypes.c_ulong),
                ("time", ctypes.c_ulong),
                ("dwExtraInfo", PUL)]

class HardwareInput(ctypes.Structure):
    _fields_ = [("uMsg", ctypes.c_ulong),
                ("wParamL", ctypes.c_short),
                ("wParamH", ctypes.c_ushort)]

class MouseInput(ctypes.Structure):
    _fields_ = [("dx", ctypes.c_long),
                ("dy", ctypes.c_long),
                ("mouseData", ctypes.c_ulong),
                ("dwFlags", ctypes.c_ulong),
                ("time",ctypes.c_ulong),
                ("dwExtraInfo", PUL)]

class Input_I(ctypes.Union):
    _fields_ = [("ki", KeyBdInput),
                 ("mi", MouseInput),
                 ("hi", HardwareInput)]

class Input(ctypes.Structure):
    _fields_ = [("type", ctypes.c_ulong),
                ("ii", Input_I)]

# Actuals Functions
class KeyEvents :
    def PressKey(self,hexKeyCode):

        extra = ctypes.c_ulong(0)
        ii_ = Input_I()
        ii_.ki = KeyBdInput( hexKeyCode, 0x48, 0, 0, ctypes.pointer(extra) )
        x = Input( ctypes.c_ulong(1), ii_ )
        SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))

    def ReleaseKey(self,hexKeyCode):

        extra = ctypes.c_ulong(0)
        ii_ = Input_I()
        ii_.ki = KeyBdInput( hexKeyCode, 0x48, 0x0002,0,ctypes.pointer(extra) )
        x = Input( ctypes.c_ulong(1), ii_ )
        SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))


    def PressAltTab(self):
        '''
        Press Alt+Tab and hold Alt key for 2 seconds in order to see the     overlay
        '''

        self.PressKey(0x012) #Alt
        self.PressKey(0x09) #Tab
        self.ReleaseKey(0x09) #~Tab
        time.sleep(2)       
        self.ReleaseKey(0x012)

    def PressTab(self):
        '''
        Press Tab Key
        '''
        #self.AltTab()          
        self.PressKey(0x09) #Tab
        self.ReleaseKey(0x09)

def PressEnter(self):
    '''
    PressEnter
    '''
    #self.AltTab()
    self.PressKey(0x0D)#Enter Key
    self.ReleaseKey(0x0D)

但是现在当我在 linux 中使用代码时,我得到了以下错误

File "KeyEvents.py", line 4, in <module>
SendInput = ctypes.windll.user32.SendInput
AttributeError: 'module' object has no attribute 'windll'

我不明白这里出了什么问题。我对 python 很陌生。请在这里帮助我。我应该怎么做才能在 linux 中实现按键事件?

【问题讨论】:

【参考方案1】:

这段代码在 Raspian Jessie (Raspberry Pi) 上运行时也遇到了同样的问题。我认为这是因为 windll.user32.SendInput 仅适用于 Windows。好像没有跨平台的灵活性..

如果你需要在 Linux 上做 Keypress 事件,你可以试试 xdotools。 我认为这非常简单,应该可以满足您的所有需求。

要安装,只需执行

sudo apt-get install xdotool

xdotool 键 alt+Tab

用于 alt+Tab 按键。

更详细的可以参考 http://xmodulo.com/simulate-key-press-mouse-movement-linux.html

【讨论】:

以上是关于AttributeError:'module'对象在python中没有属性'windll'的主要内容,如果未能解决你的问题,请参考以下文章

api = twitter.Api() AttributeError: 'module' 对象没有属性 'Api

AttributeError:'module'对象在python中没有属性'windll'

如何修复python2.7中的“AttributeError:'module'对象没有属性'storage'”错误

AttributeError:“模块”对象没有属性“作者”

AttributeError:'module'对象没有属性'cbook'

AttributeError:“模块”对象没有属性“WebSocketApp”