
[code]

    # coding: utf-8
    from datetime import datetime
    from pywinauto import application
    app = application.Application.start("notepad.exe")
    
    app.Notepad.Edit1.SetText(unicode(datetime.now()))
    app.Notepad.MenuSelect(u"ファイル->名前を付けて保存")
    dialog = app[u"名前を付けて保存"]
    dialog.Edit1.SetText(u"datetime.txt")
    dialog.Button1.Click()
    
    confirm = app[u"名前を付けて保存の確認"]
    if confirm.Exists():
        confirm.Button1.Click()
    
    
    app.Notepad.TypeKeys("%FX")
    
[/code]

以下内容のエラーが出るのですが、

[code]

     Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
      a[besti+bestsize] == b[bestj+bestsize]:
    Traceback (most recent call last):
      File "L:/tools/Python/pyauto/notepad.py", line 7, in <module>
        app.Notepad.MenuSelect(u"ファイル->名前を付けて保存")
      File "C:\Python27\lib\site-packages\pywinauto\controls\HwndWrapper.py", line 1316, in MenuSelect
        self.MenuItem(path, exact=exact).Select()
      File "C:\Python27\lib\site-packages\pywinauto\controls\HwndWrapper.py", line 1266, in MenuItem
        return self.Menu().GetMenuPath(path, appdata = menu_appdata, exact=exact)[-1]
      File "C:\Python27\lib\site-packages\pywinauto\controls\menuwrapper.py", line 470, in GetMenuPath
        self.Items())
      File "C:\Python27\lib\site-packages\pywinauto\findbestmatch.py", line 139, in find_best_match
        raise MatchError(items = text_item_map.keys(), tofind = search_text)
    pywinauto.findbestmatch.MatchError   
    
[/code]

ユニコードがおかしいのでしょうか？  
当方プログラム初心者の為、解決策を見出すことができません。  
ご教授いただけませんでしょうか？  
Pythonは2.79 pywinautoは0.41を使用しております。  
お手数ですがよろしくお願いいたします。


CC BY-SA 3.0
2015-07-16T12:31:47.463
12422
2015-09-08T01:24:01.820
2015-09-08T01:14:23.897
440
10527
question
python
pywinautoに関しまして


`pywinauto/controls/menuwrapper.py`というファイルには、`win32gui.GetMenuItemInfo`が使われているのですが、その関数はユニコードを対応しないと思います。

より[古いバージョンのpywinautoのコード](http://pywinauto.googlecode.com/hg-
history/d46c607b2a4850b3c2395263e50a90f89da20374/pywinauto/controls/menuwrapper.py)をチェックすると、`pywinauto/win32functions.py`の`GetMenuItemInfo`が使われています。`win32functions`というファイルには、`GetMenuItemInfo`は`ctypes.windll.user32.GetMenuItemInfoW`というユニコードを対応する関数に送信しています。

`MenuItem`というクラスの`_read_item`と`Text`を古いコードに置き換えると、動くようになるみたいです：

[code]

    # coding: utf-8
    import ctypes
    from datetime import datetime
    from pywinauto import application
    from pywinauto.controls.menuwrapper import MenuItem, win32structures, win32functions, win32defines
    
    
    def _read_item(self):
        """Read the menu item info
    
        See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/menus/menureference/menufunctions/getmenuiteminfo.asp
        for more information."""
        menu_info  = win32structures.MENUITEMINFOW()
        menu_info.cbSize = ctypes.sizeof (menu_info)
        menu_info.fMask = \
            win32defines.MIIM_CHECKMARKS | \
            win32defines.MIIM_ID | \
            win32defines.MIIM_STATE | \
            win32defines.MIIM_SUBMENU | \
            win32defines.MIIM_TYPE #| \
            #MIIM_FTYPE #| \
            #MIIM_STRING
            #MIIM_DATA | \
    
        ret = win32functions.GetMenuItemInfo (
            self.menu,
            self.index,
            True,
            ctypes.byref(menu_info))
    
        if not ret:
            raise ctypes.WinError()
    
        return menu_info
    
    def Text(self):
        "Return the state of this menu item"
    
        info = self._read_item()
        # if there is text
        if info.cch:
            # allocate a buffer
            buffer_size = info.cch+1
            text = ctypes.create_unicode_buffer(buffer_size)
    
            # update the structure and get the text info
            info.dwTypeData = ctypes.addressof(text)
            info.cch = buffer_size
    
            win32functions.GetMenuItemInfo (
                self.menu,
                self.index,
                True,
                ctypes.byref(info))
    
            text = text.value
        else:
            text = ''
    
        return text
    MenuItem._read_item = _read_item
    MenuItem.Text = Text
    
    
    app = application.Application.start("notepad.exe")
    
    app.Notepad.Edit1.SetText(unicode(datetime.now()))
    app.Notepad.MenuSelect(u"ファイル->名前を付けて保存")
    dialog = app[u"名前を付けて保存"]
    dialog.Edit1.SetText(u"datetime.txt")
    dialog.Button1.Click()
    
    confirm = app[u"名前を付けて保存の確認"]
    if confirm.Exists():
        confirm.Button1.Click()
    
    
    app.Notepad.TypeKeys("%FX")
    
[/code]

なので、`pywinauto`というモジュール内のユニコードバグみたいです。


CC BY-SA 3.0
2015-09-08T01:10:15.390
16360
2015-09-08T01:24:01.820
2015-09-08T01:24:01.820
11003
11003
12422
answer