2012-09-05 43 views
-2

这是我的脚本。由于某种原因,它不再工作。它以前做过。有人可以追查任何潜在的错误吗?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) :返回窗口 .TaskBarIcon_SetIcon(* ARGS,** kwargs) mounter.py(18):self.Bind(wx.EVT_TASKBAR_LEFT_DOWN,self.on_left_down) --- MODULENAME:_Core,funcname的:绑定 _core.py (3916):assert isinstance(event,wx.PyEventBinder) _core.py(3917):断言处理程序是无或可调用的(h (3919):如果源不是无: _core.py(3921):event.Bind(self())();如果源不是None, ,id,id2,handler)
--- modulename:_core,funcname:Bind _core.py(3994):for et in.evtType: _core.py(3995):target.Connect(id1,id2,等,功能) --- MODULENAME:_Core,funcname的:连接 _core.py(3875):返回核心 .EvtHandler_Connect(* ARGS,** kwargs) _core.py(3994):在自我等。 evtType: mounter.py(44):app.MainLoop() --- modulename:_core,funcname:MainLoop _core.py(8010):wx.PyApp.MainLoop(个体经营) --- MODULENAME:_Core,funcname的状态:Mainloop _core.py(7306):返回核心 .PyApp_MainLoop(* ARGS,** kwargs)

+0

它在哪里退出?顺便说一句,你应该阅读PEP8当你有一段时间 – lolopop

+0

我不知道。我不是一个Python程序员,我只是找到一个教程,并编辑我的目的。它曾经工作,但现在它突然没有。我没有更改任何已安装的软件包。我试着让一个init脚本在启动时启动它,但那也行不通。 – tristan202

+0

那么,#1你至少应该试图理解你的系统中的任何代码。盲目拷贝粘贴是一个坏主意。 #2“它不再工作了”是一个非常模糊的问题,没有错误信息,测试用例,甚至只是描述了你期望看到的内容以及你实际看到的内容,那么很不可能我们可以帮助你。你有没有尝试过调试代码? – acattle

回答

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工具包。我相信你可以用你理解的语言找到你需要的东西。通过将你不明白的代码放入你的应用程序中,你实际上只是放入一个可能会失败的新代码,如果它确实存在,那么你无法修复它。

我不知道你和我不知道你的专业知识,所以我给你的好处这次但我需要看到你下一次更多的努力或我赢了不会回答。

祝你好运。