这是我的剧本。由于某种原因,它不再起作用了。它以前做过。有人可以追踪任何潜在的错误吗?
#! /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)
答案 0 :(得分:2)
在PyDev中调试代码时,我无法重现您的错误。但是,我发现了一大堆我必须解决的错误,因为代码甚至会执行。修好后,代码运行正常。
首先,您的错误表明self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)
来电中的“处理程序”为None
。在这种情况下,这意味着self.on_left_down
为None
。但是,我们可以看到有一个函数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工具包。我相信你能用你理解的语言找到能满足你需要的东西。通过将您不理解的代码放入您的应用程序中,您实际上只是放入一个可能失败的新部分,如果确实如此,则无法修复它。
我不认识你,我不知道你的专业知识,所以我这次给你带来了怀疑 但是我需要看到你下一步的努力时间或我不会发布答案。
祝你好运。