2014-01-29 45 views
4

我有一個簡單的Python應用程序,它位於Windows XP系統托盤中。該應用程序使用pywin32(Build 218)作爲其GUI,並在Python 2.7.6上運行。一切很順利,直到我試圖用Unicode值創建一個菜單項:win32gui.AppendMenu中的Unicode字符呈現爲問號

# -*- coding: utf-8 -*- 
import win32gui 

... 

menu = win32gui.CreatePopupMenu() 
win32gui.AppendMenu(menu, win32con.MF_STRING, 1, u'Выход') 

該菜單項呈現五個問號(「?????」),而ASCII字符串工作得很好。

如果我改變字符串字面定義爲Python 3和Python的3.3.3運行,菜單項文本正確顯示:

win32gui.AppendMenu(menu, win32con.MF_STRING, 1, 'Выход') 

呈現爲「Выход」。

我必須堅持使用Python 2,因爲應用程序使用的某些模塊與3.x.x不兼容。

SO與C的類似問題(#1,#2)WinAPI似乎可以通過定義UNICODE並使用L「字符串文字來解決。但我不知道如何用pywin32來完成這個任務。對字符串使用utf-16le編碼沒有幫助。

+0

瞎猜:嘗試用'win32gui.AppendMenuW' – manuell

+0

@manuell呀,如果只是這樣的功能在'win32gui'存在:'AttributeError的: '模塊' 對象有沒有屬性 'AppendMenuW' ' – Warwick

+1

然後,您可以使用ctypes並調用'ctypes.windll.User32.AppendMenuW' – manuell

回答

3

​​允許調用本機Win32 API。

使用ctypes.windll.User32.AppendMenuW

+0

你能舉一個例子嗎?上面的函數不接受來自「win32gui_struct.PackMENUITEMINFO」的錯誤「ctypes.ArgumentError:參數4:的結構」:不知道如何將參數4「 – Durgaprasad

+0

@Durgaprasad Soory,我不能理解你的問題。參數4可以是一個unicode字符串,一個位圖句柄或一個任意的32位值。它取決於參數2中的位。請參閱https://msdn.microsoft.com/en-us/library/windows/desktop/ms647616 – manuell

+0

得到了答案。 (Hmenu01Info)的地址將是第4個參數。另一個問題是MENUITEMINFO和MENUITEMINFOW有什麼不同。第二個是InsertMenuItemW的recomanded。 – Durgaprasad