wxPython脚本挂起原因不明

时间:2012-09-05 12:10:49

标签: android python wxpython

这是我的剧本。由于某种原因,它不再起作用了。它以前做过。有人可以追踪任何潜在的错误吗?

    #! /usr/bin/env python

import wx
import os
TRAY_TOOLTIP = 'jmtpfs mounter'

def create_menu_item(menu, label, func):
    item = wx.MenuItem(menu, -1, label)
    menu.Bind(wx.EVT_MENU, func, id=item.GetId())
    menu.AppendItem(item)
    return item

class TaskBarIcon(wx.TaskBarIcon):
    def __init__(self):
        super(TaskBarIcon, self).__init__()
    self.off=wx.IconFromBitmap(wx.Bitmap("android_off.png"))
    self.SetIcon(self.off)
        self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)
    def CreatePopupMenu(self):
        menu = wx.Menu()
        create_menu_item(menu, 'Mount', self.mount)
        create_menu_item(menu, 'UnMount', self.unmount)
        menu.AppendSeparator()
        create_menu_item(menu, 'Exit', self.on_exit)
        return menu
    def on_left_down(self, event):
        print 'Tray icon was left-clicked.'
    def mount(self, event):
        retvalue = os.system("jmtpfs ~/Nexus")
        print retvalue
    self.on=wx.IconFromBitmap(wx.Bitmap("android_on.png"))
    self.SetIcon(self.on)
    def unmount(self, event):
        retvalue = os.system("fusermount -u ~/Nexus")
    print retvalue
    self.off=wx.IconFromBitmap(wx.Bitmap("android_off.png"))
    self.SetIcon(self.off)
    def on_exit(self, event):
        wx.CallAfter(self.Destroy)

def main():
    app = wx.PySimpleApp()
    TaskBarIcon()
    app.MainLoop()

if __name__ == '__main__':
    main()

运行跟踪可以得到:

mounter.py(17):self.SetIcon(self.off)  --- modulename:_windows,funcname:SetIcon _windows.py(2174):return windows .TaskBarIcon_SetIcon(* args,** kwargs) mounter.py(18):self.Bind(wx.EVT_TASKBAR_LEFT_DOWN,self.on_left_down)  --- modulename:_core,funcname:Bind _core.py(3916):assert isinstance(event,wx.PyEventBinder) _core.py(3917):断言处理程序是无或可调用的(处理程序) _core.py(3918):断言源为None或hasattr(source,'GetId') _core.py(3919):如果source不是None: _core.py(3921):event.Bind(self,id,id2,handler)
 --- modulename:_core,funcname:Bind _core.py(3994):for self in self.evtType: _core.py(3995):target.Connect(id1,id2,et,function)  --- modulename:_core,funcname:Connect _core.py(3875):return core .EvtHandler_Connect(* args,** kwargs) _core.py(3994):for self in self.evtType: mounter.py(44):app.MainLoop()  --- modulename:_core,funcname:MainLoop _core.py(8010):wx.PyApp.MainLoop(个体经营)  --- modulename:_core,funcname:MainLoop _core.py(7306):return core .PyApp_MainLoop(* args,** kwargs)

1 个答案:

答案 0 :(得分:2)

在PyDev中调试代码时,我无法重现您的错误。但是,我发现了一大堆我必须解决的错误,因为代码甚至会执行。修好后,代码运行正常。

首先,您的错误表明self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)来电中的“处理程序”为None。在这种情况下,这意味着self.on_left_downNone。但是,我们可以看到有一个函数on_left_down(self, event),所以这是我第一次暗示你的代码出了问题。第二个提示是堆栈跟踪似乎包含Bind()调用作为行self.SetIcon(self.off)的一部分,这没有任何意义。

当我注意到你的缩进很糟糕的时候。在像Java这样的语言中,{}之间的所有内容都是函数的一部分,因此缩进只是为了使代码更易于阅读。在Python缩进更重要。这就是你如何将某些东西表示为某种功能的一部分。你怎么知道一行代码是否仍然是循环的一部分?你检查缩进。 __init__()mount()unmount()都包含向左缩进的行,因此即使在__init__()运行之前也会运行,可能会导致这些行None值。

其次,您必须使用旧教程,因为wx.PySimpleApp已弃用。在代码执行之前我必须编写自己的简单wx.App(我的整个wx.App只有4行,包括声明。我相信你可以找到一个如何自己做的简单示例)

最后,请求:请永远不要永远盲目地使用您在教程中找到的代码,特别是如果您不熟悉该语言。你说你不是python程序员,为什么选择wxPython?你知道C吗? wxPython基于wxWidgets,一个用于C的GUI工具包。你知道Java吗? Java有许多GUI工具包。我相信你能用你理解的语言找到能满足你需要的东西。通过将您不理解的代码放入您的应用程序中,您实际上只是放入一个可能失败的新部分,如果确实如此,则无法修复它。

我不认识你,我不知道你的专业知识,所以我这次给你带来了怀疑 但是我需要看到你下一步的努力时间或我不会发布答案。

祝你好运。