【问题标题】:wxPython script hanging for unknown reasonwxPython 脚本因未知原因挂起
【发布时间】:2012-08-30 03:43:11
【问题描述】:

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

    #! /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) --- 模块名:_windows,函数名:SetIcon _windows.py(2174): 返回 windows.TaskBarIcon_SetIcon(*args, **kwargs) mounter.py(18): self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down) --- 模块名:_core,函数名:绑定 _core.py(3916): 断言 isinstance(事件, wx.PyEventBinder) _core.py(3917):断言处理程序是无或可调用的(处理程序) _core.py(3918): 断言源为 None 或 hasattr(source, 'GetId') _core.py(3919):如果源不是无: _core.py(3921): event.Bind(self, id, id2, handler)
--- 模块名:_core,函数名:绑定 _core.py(3994): for et in self.evtType: _core.py(3995): target.Connect(id1, id2, et, 函数) --- 模块名:_core,函数名:连接 _core.py(3875): 返回 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): 返回 core.PyApp_MainLoop(*args, **kwargs)

【问题讨论】:

  • 它从哪里退出?顺便说一句,你应该在有时间的时候阅读 PEP8
  • 我不知道。我不是python程序员,我只是找到了一个教程,并根据我的目的进行了编辑。以前可以用,现在突然不行了。我没有更改任何已安装的软件包。我尝试制作一个初始化脚本以在启动时启动它,但这也不起作用。
  • 好吧,#1,您至少应该尝试理解您放入系统中的任何代码。盲目复制粘贴是个坏主意。 #2 “它不再起作用”是一个非常模糊的问题,没有错误消息、测试用例,甚至只是对您期望看到的内容和实际看到的内容的描述,那么我们很难为您提供帮助.您是否尝试过调试代码?

标签: android python wxpython


【解决方案1】:

在 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 工具包。我敢肯定,您可以用您理解的语言找到可以满足您需求的东西。通过将您不理解的代码放入您的应用程序中,您实际上只是在放入一个可能会失败的新部分,如果它确实如此,那么您将无法修复它。

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

祝你好运。

【讨论】:

    猜你喜欢
    • 2022-12-10
    • 2019-04-30
    • 2019-05-27
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多