2012-09-05 45 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工具包。我相信你可以用你理解的語言找到你需要的東西。通過將你不明白的代碼放入你的應用程序中,你實際上只是放入一個可能會失敗的新代碼,如果它確實存在,那麼你無法修復它。

我不知道你和我不知道你的專業知識,所以我給你的好處這次但我需要看到你下一次更多的努力或我贏了不會回答。

祝你好運。