首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止进程pygtk

停止进程pygtk
EN

Stack Overflow用户
提问于 2014-07-17 14:25:17
回答 1查看 762关注 0票数 3

我尝试使用pygtk制作一个简单的应用程序来播放和停止midi文件。

到目前为止,我的情况如下:

代码语言:javascript
复制
import pygtk
pygtk.require('2.0')
import gtk
import subprocess


class Teacher:

    def __init__(self):

        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.set_size_request(400, 200)
        window.set_title("Music Teacher")
        window.connect("delete_event",
                   lambda w,e: gtk.main_quit())

        table = gtk.Table(4, 4, True)
        window.add(table)

        play = gtk.Button("Play")
        play.connect("clicked", self.clicked_play)
        play.show()

        stop = gtk.Button("Stop")
        stop.show()

        table.attach(play, 0, 1, 0, 1)
        table.attach(stop, 0, 1, 1, 2)

        window.show_all()

    def clicked_play(self, widget):
        subprocess.Popen(["timidity", "~/somefile.mid"])

    def main(self):
        gtk.main()
        return 0


Teacher().main()

我能从stop和delete_event发送中断来终止进程吗?我应该使用线程吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-17 14:39:27

您可以处理按下这样的SIGTERM、Ctrl+C或停止按钮:

代码语言:javascript
复制
import pygtk
pygtk.require('2.0')
import gtk
import subprocess
import signal


class Teacher:

    def __init__(self):
        self.proc = None  # Initialize the handle to our subprocess
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.set_size_request(400, 200)
        window.set_title("Music Teacher")
        window.connect("delete_event",
                   lambda w,e: gtk.main_quit())

        table = gtk.Table(4, 4, True)
        window.add(table)

        play = gtk.Button("Play")
        play.connect("clicked", self.clicked_play)
        play.show()

        stop = gtk.Button("Stop")
        stop.connect("clicked", self.clicked_stop)
        stop.show()

        table.attach(play, 0, 1, 0, 1)
        table.attach(stop, 0, 1, 1, 2)

        window.show_all()

    def clicked_play(self, widget):
        self.proc = subprocess.Popen(["timidity", "~/somefile.mid"])

    def clicked_stop(self, widget=None):
        if self.proc:
            self.proc.terminate()
            self.proc.wait()

    def handle_sigterm(self, *args):
        self.clicked_stop()
        sys.exit()

    def main(self):
        signal.signal(signal.SIGTERM, self.handle_sigterm)
        try:
            gtk.main()
        except KeyboardInterrupt:
            self.clicked_stop()
            raise
        return 0


Teacher().main()

我们只需保存对我们在Popen中创建的clicked_play对象的引用,然后使用该句柄使用click_stop中的terminate实例方法向进程发送SIGTERM。然后我们调用wait (除非timidity没有关闭SIGTERM)来获取终止的进程(因此不会留下僵尸)。

我还在对try的调用中添加了一个gtk.main() /except,以便在接收到信号时,在发出Ctrl+C时调用clicked_stop,并发出同样的SIGTERM处理程序。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24806231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档