2013-05-20 81 views
0

我已經創建了一個統一指示器小程序與蟒蛇和林間空地。以下是點擊指示器小程序時出現的屏幕截圖。您可以看到首選項菜單。點擊此首選項菜單後,會打開一個新窗口。Python統一指示器小程序和空白子窗口

Indicator Applet Menu
Indicator Applet Menu

Preference Window
Preference Window

現在的問題是,當我點擊關閉按鈕,整個應用程序的存在。

如下圖所示觸發首選項窗口中的代碼:

def action_preferences(self, widget): 
    ''' 
    Show the preferences window 
    ''' 
    base = PreferenceWindow() 
    base.main() 

    self.menu_setup() 

preference.py具有下面的代碼:

 
import sys 
import json 
import pynotify 

try: 
    import pygtk 
    pygtk.require("2.0") 
except: 
    pass 
try: 
    import gtk 
    import gtk.glade 
except: 
    print("GTK is not Available") 
    sys.exit(1) 

class PreferenceWindow: 
    ui = None 
    configs = {} 
    notify = None 
    window = None 

    def __init__(self): 

     if not pynotify.init ("nepal-loadshedding"): 
      sys.exit (1) 

     self.ui = gtk.glade.XML("pref_ui.glade") 

     # Get the preference saved previously 
     self.configs = self.parse_configs() 

     saved_group_value = str(self.configs.get("GROUP")) 

     self.ui.get_widget("text_group_number").set_text(saved_group_value) 

     dic = { 
      "on_btn_pref_ok_clicked":self.on_save_preference, 
      "on_btn_pref_close_clicked":self.on_close, 
      "on_preference_window_destroy":self.on_quit, 
      } 

     self.ui.signal_autoconnect(dic) 

     if self.window is None:    
      self.window = self.main() 

    def parse_configs(self): 
     self.configs = json.load(open("config.txt")) 
     return self.configs 

    def save_configs(self, key, value): 
     self.configs[key] = int(value) 
     json.dump(self.configs, open("config.txt", "wb")) 
     return True 

    def on_save_preference(self, widget): 
     group_number = self.ui.get_widget("text_group_number").get_text() 
     self.save_configs("GROUP", group_number) 

     # try the icon-summary case 
     if self.notify == None: 
      self.notify = pynotify.Notification ("Nepal Loadshedding", "Group saved successfully to : " + group_number) 
     else: 
      self.notify.update("Nepal Loadshedding", "Group saved successfully to : " + group_number) 
      self.notify.set_timeout(100) 

     self.notify.show() 
     print "Saved successfully" 

    def on_close(self, widget): 
     print 'close event called' 

    def on_quit(self, widget): 
     sys.exit(0) 

    def main(self): 
     gtk.main() 

回答

0

不能稱之爲sys.exit()因爲它會使你的整個應用程序終止(如你所見)。你需要做的是致電gtk.main_quit()。當您點擊關閉按鈕時,您可以銷燬該窗口。

def on_close(self, widget): 
    self.ui.get_widget("<window-name>").destroy() 

def on_quit(self, widget): 
    gtk.main_quit() 

此外,您撥打兩次PreferencesWindow.main()(一個在__init__()底部和實例化後的第二次,用base.main()),這反過來又調用gtk.main()。你必須刪除其中的一個,否則你的應用程序會卡在第二個。

+0

感謝您的反饋。我已經更改了代碼。其實我正在尋找一種方式來使用偏好類型的窗口,它將在其唯一目的之後關閉。如果你在97行查看這個要點https://gist.github.com/samundra/7637068,你可以看到我已經初始化了一個首選項窗口。我希望這個winodw能夠保持正常的程序流程。 – Samundra

+0

該代碼與您在此發佈的代碼相同。當你調用'base.main()'時,流程將在那裏停止,直到關閉「首選項」窗口。當發生這種情況時,'action_preferences'將會結束,'base'將被銷燬,因爲它超出了範圍。 – xOneca

+0

我注意到你調用過'gtk.main()'兩次。你只需要調用一次**。我已經添加了答案。 – xOneca