-2

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

    #! /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)---模块名称:_core,funcname:绑定_core.py(3916):断言isinstance(事件,wx.PyEventBinder)_core.py(3917):断言处理程序是无或 callable(handler) _core.py(3918): assert source is None or hasattr(source, 'GetId') _core.py(3919): if source is not None: _core.py(3921): event.Bind(self , id, id2, 处理程序)
--- 模块名:_core,funcname:绑定 _core.py(3994):for et in self.evtType:_core.py(3995):target.Connect(id1, id2, et, function) --- 模块名:_core, funcname: Connect _core.py(3875): return core .EvtHandler_Connect(*args, **kwargs) _core.py(3994): for et in self.evtType: mounter.py(44): app.MainLoop() -- - 模块名称:_core,函数名称:MainLoop _core.py(8010):wx.PyApp.MainLoop(self) --- 模块名称:_core,函数名称:MainLoop _core.py(7306):返回核心.PyApp_MainLoop(*args, **夸格斯)

4

1 回答 1

2

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

首先,您的错误表明您self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)调用中的“处理程序”是None. 在这种情况下,它的意思self.on_left_downNone。但是,我们可以看到有一个 function on_left_down(self, event),所以这是我第一次暗示您的代码有问题。第二个提示是堆栈跟踪似乎包含该Bind()调用作为 line 的一部分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 工具包。我敢肯定,您可以用您理解的语言找到可以满足您需求的东西。通过将您不理解的代码放入您的应用程序中,您实际上只是在放入一个可能会失败的新部分,如果是这样,那么您将无法修复它。

我不认识你,也不知道你的专业知识,所以这次我要让你受益,但下次我需要看到你付出更多的努力,否则我不会发布答案。

祝你好运。

于 2012-09-06T06:12:57.373 回答