我正在阅读builder.connect_signals,它使用python文件中的方法映射glade文件的处理程序。显然可以工作,除了主窗口,当你关闭它时不会破坏。如果从终端运行它仍在运行,则必须按Ctrl-C才能完全关闭应用程序。
这是我的python代码:
#!/usr/bin/env python
import pygtk
import gtk
#from gi.repository import Gtk
import gtk.glade
class Mixer:
def __init__(self):
self.gladefile = "mixer3.glade"
self.wTree = gtk.Builder()
self.wTree.add_from_file(self.gladefile)
window = self.wTree.get_object("window1")
#if (window):
# window.connect("destroy", gtk.main_quit)
#line_btn = self.wTree.get_object("toggle_linein")
#line_btn.connect("on_toggle_linein_activate", btn_linein_activated)
self.wTree.connect_signals(self)
window.show_all() # must have!
def on_toggle_linein_clicked(self, widget):
print "Clicked"
def Destroy(self, obj):
gtk.main_quit()
if __name__ == "__main__":
m = Mixer()
gtk.main()
答案 0 :(得分:1)
在关闭窗口时,您的窗口会破坏,但程序的主循环不会停止,您必须将 destroy 事件连接到从最后一行代码运行的此循环中退出的方法/函数。 在下面的代码行中进行一些更改:
#if (window):
# window.connect("destroy", gtk.main_quit)
更改为:
if (window):
window.connect("destroy", self.Destroy)
答案 1 :(得分:0)
您可以使用GtkApplication
和GtkApplicationWindow
为您管理它。当应用程序没有更多打开的窗口时,它将自动终止。
#!/usr/bin/env python
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gio
class Mixer(Gtk.Application):
def __init__(self):
super(Mixer, self).__init__(application_id="org.test",
flags=Gio.ApplicationFlags.FLAGS_NONE)
def do_activate(self):
self.gladefile = "mixer3.glade"
self.wTree = Gtk.Builder()
self.wTree.add_from_file(self.gladefile)
# window1 must be an ApplicationWindow in glade file
window = self.wTree.get_object("window1")
self.add_window(window) # window should be added to application
# but only after 'activate' signal
window.show_all()
if __name__ == "__main__":
m = Mixer()
m.run() # No gtk.main(), GtkApplication manages it