2011-09-23 8 views
5

最近、wxPythonの開発リリース(wxPython 2.9.2.4)にアップグレードしました。アプリケーション内でwx.NotificationMessageの機能が必要でした。私は可能性のあるバグかもしれないと思う何らかのユーザイベントのために、通知のバブルを作成しようとして失敗しています。このようなバグを提出する前に、私は先に進み、メーリングリストの人々に問題の可能性があると尋ねて、うまくいけば私のコードの中から解決策を見つけたいと思っていました。ここでwxPythonでwx.NotificationMessageを正しく使用できません

は、私が使用しているコードです:私のWindows 7のコンピュータで

import wx, sys 

app = wx.PySimpleApp() 

class TestTaskBarIcon(wx.TaskBarIcon): 

    def __init__(self): 
     wx.TaskBarIcon.__init__(self) 
     # create a test icon 
     bmp = wx.EmptyBitmap(16, 16) 
     dc = wx.MemoryDC(bmp) 
     dc.SetBrush(wx.RED_BRUSH) 
     dc.Clear() 
     dc.SelectObject(wx.NullBitmap) 

     testicon = wx.EmptyIcon() 
     testicon.CopyFromBitmap(bmp) 

     self.SetIcon(testicon) 
     self.Bind(wx.EVT_TASKBAR_LEFT_UP, lambda e: (self.RemoveIcon(),sys.exit())) 

     wx.NotificationMessage("", "Hello world!").Show() 

icon = TestTaskBarIcon() 
app.MainLoop() 

、コードは小さな白いタスクバーアイコンを作成し、フレーズとポップアップ作成の「Hello World!」という。問題?メッセージは私のアイコンにありません。別のアイコンが作成され、メッセージがそこに配置されています。

: このイメージを参照してください:私はこれが原因私は22行目には親のパラメータを渡されていないという事実におそらくあることだと思った何> http://www.pasteall.org/pic/18068" を

Traceback (most recent call last): 
    File "C:\Python27\testnotificationmessage.py", line 24, in <module> 
    icon = TestTaskBarIcon() 
    File "C:\Python27\testnotificationmessage.py", line 22, in __init__ 
    wx.NotificationMessage("", "Hello world!", self).Show() 
    File "C:\Python27\lib\site-packages\wx-2.9.2-msw\wx\_misc.py", line 1213, in __init__ 
    _misc_.NotificationMessage_swiginit(self,_misc_.new_NotificationMessage(*args)) 
TypeError: in method 'new_NotificationMessage', expected argument 3 of type 'wxWindow *' 
0:

「自己」は、タスクバーアイコンを指し
wx.NotificationMessage("", "Hello world!", self).Show() 

私はそれを行うとき、私はエラーを取得する:ここで

wx.NotificationMessage("", "Hello world!").Show() 

は、私はそれを変更するものです

何が起こっているのですか?私がその議論を削除した場合、私は結果を得ることができません、議論を追加すると、私はエラーが発生します! wx.TaskBarIconでwx.NotificationMessageをどのように使用するのですか?

助けてください!私は十分な詳細を提供したことを願っています。もっと必要な場合はコメントしてください!

+0

2.9.2.4のドキュメントはありますか?私は盲目であるか、運が良かった... – Fenikso

答えて

9

まだ2.9を使用することはお勧めできません。私はそれを試してみるときにいくつかの奇妙なバグに遭遇しました。

2.8でも同じ機能を使用できます。私はしばらく前に見つけた多少変更されたコードを使用しています。

import wx, sys 

try: 
    import win32gui #, win32con 
    WIN32 = True 
except: 
    WIN32 = False 

class BalloonTaskBarIcon(wx.TaskBarIcon): 
    """ 
    Base Taskbar Icon Class 
    """ 
    def __init__(self): 
     wx.TaskBarIcon.__init__(self) 
     self.icon = None 
     self.tooltip = "" 

    def ShowBalloon(self, title, text, msec = 0, flags = 0): 
     """ 
     Show Balloon tooltip 
     @param title - Title for balloon tooltip 
     @param msg - Balloon tooltip text 
     @param msec - Timeout for balloon tooltip, in milliseconds 
     @param flags - one of wx.ICON_INFORMATION, wx.ICON_WARNING, wx.ICON_ERROR 
     """ 
     if WIN32 and self.IsIconInstalled(): 
      try: 
       self.__SetBalloonTip(self.icon.GetHandle(), title, text, msec, flags) 
      except Exception: 
       pass # print(e) Silent error 

    def __SetBalloonTip(self, hicon, title, msg, msec, flags): 

     # translate flags 
     infoFlags = 0 

     if flags & wx.ICON_INFORMATION: 
      infoFlags |= win32gui.NIIF_INFO 
     elif flags & wx.ICON_WARNING: 
      infoFlags |= win32gui.NIIF_WARNING 
     elif flags & wx.ICON_ERROR: 
      infoFlags |= win32gui.NIIF_ERROR 

     # Show balloon 
     lpdata = (self.__GetIconHandle(), # hWnd 
        99,      # ID 
        win32gui.NIF_MESSAGE|win32gui.NIF_INFO|win32gui.NIF_ICON, # flags: Combination of NIF_* flags 
        0,      # CallbackMessage: Message id to be pass to hWnd when processing messages 
        hicon,     # hIcon: Handle to the icon to be displayed 
        '',      # Tip: Tooltip text 
        msg,      # Info: Balloon tooltip text 
        msec,      # Timeout: Timeout for balloon tooltip, in milliseconds 
        title,     # InfoTitle: Title for balloon tooltip 
        infoFlags     # InfoFlags: Combination of NIIF_* flags 
       ) 
     win32gui.Shell_NotifyIcon(win32gui.NIM_MODIFY, lpdata) 

     self.SetIcon(self.icon, self.tooltip) # Hack: because we have no access to the real CallbackMessage value 

    def __GetIconHandle(self): 
     """ 
     Find the icon window. 
     This is ugly but for now there is no way to find this window directly from wx 
     """ 
     if not hasattr(self, "_chwnd"): 
      try: 
       for handle in wx.GetTopLevelWindows(): 
        if handle.GetWindowStyle(): 
         continue 
        handle = handle.GetHandle() 
        if len(win32gui.GetWindowText(handle)) == 0: 
         self._chwnd = handle 
         break 
       if not hasattr(self, "_chwnd"): 
        raise Exception 
      except: 
       raise Exception, "Icon window not found" 
     return self._chwnd 

    def SetIcon(self, icon, tooltip = ""): 
     self.icon = icon 
     self.tooltip = tooltip 
     wx.TaskBarIcon.SetIcon(self, icon, tooltip) 

    def RemoveIcon(self): 
     self.icon = None 
     self.tooltip = "" 
     wx.TaskBarIcon.RemoveIcon(self) 

# =================================================================== 
app = wx.PySimpleApp() 

class TestTaskBarIcon(BalloonTaskBarIcon): 

    def __init__(self): 
     wx.TaskBarIcon.__init__(self) 
     # create a test icon 
     bmp = wx.EmptyBitmap(16, 16) 
     dc = wx.MemoryDC(bmp) 
     dc.SetBrush(wx.RED_BRUSH) 
     dc.Clear() 
     dc.SelectObject(wx.NullBitmap) 

     testicon = wx.EmptyIcon() 
     testicon.CopyFromBitmap(bmp) 

     self.SetIcon(testicon) 
     self.Bind(wx.EVT_TASKBAR_LEFT_UP, lambda e: (self.RemoveIcon(),sys.exit())) 

     self.ShowBalloon("", "Hello world!") 

icon = TestTaskBarIcon() 
app.MainLoop() 
6

Windowsのみ実装されてShowBalloon呼ばTaskBarIconで文書化されていない隠された方法があります。 the sourceから

def ShowBalloon(*args, **kwargs): 
    """ 
    ShowBalloon(self, String title, String text, unsigned int msec=0, int flags=0) -> bool 

    Show a balloon notification (the icon must have been already 
    initialized using SetIcon). Only implemented for Windows. 

    title and text are limited to 63 and 255 characters respectively, msec 
    is the timeout, in milliseconds, before the balloon disappears (will 
    be clamped down to the allowed 10-30s range by Windows if it's outside 
    it) and flags can include wxICON_ERROR/INFO/WARNING to show a 
    corresponding icon 

    Returns True if balloon was shown, False on error (incorrect parameters 
    or function unsupported by OS) 

    """ 
    return _windows_.TaskBarIcon_ShowBalloon(*args, **kwargs) 

私はwxPythonを2.9.4.0とWindows上でそれをテストし、それがうまく動作します。

関連する問題