我用python和glade创建了一个统一指示器小程序 . 以下是单击指标小程序时显示的屏幕截图 . 您可以看到首选项菜单 . 单击此首选项菜单后,将打开一个新窗口 .
Indicator Applet Menu
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()
1 回答
您无法调用
sys.exit()
,因为它会使您的整个应用程序终止(如您所见) . 你要做的就是拨打gtk.main_quit() . 单击关闭按钮时,可以销毁窗口 .此外,您调用两次
PreferencesWindow.main()
(一个在__init__()
的底部,第二次在实例化后,使用base.main()
),然后调用gtk.main() . 您必须删除其中一个,否则您的应用程序将卡在第二个上 .