关闭窗口不会退出应用程序

时间:2015-01-26 09:07:37

标签: python pygtk glade

我正在阅读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()

2 个答案:

答案 0 :(得分:1)

在关闭窗口时,您的窗口会破坏,但程序的主循环不会停止,您必须将 destroy 事件连接到从最后一行代码运行的此循环中退出的方法/函数。 在下面的代码行中进行一些更改:

#if (window):
    #  window.connect("destroy", gtk.main_quit)

更改为:

if (window):
    window.connect("destroy", self.Destroy)

答案 1 :(得分:0)

您可以使用GtkApplicationGtkApplicationWindow为您管理它。当应用程序没有更多打开的窗口时,它将自动终止。

#!/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