停止一个进程pyg

2024-04-23 14:05:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

以下是我目前所掌握的情况:

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()

有没有我可以从停止和删除事件发送中断来终止进程?我应该使用线程吗?在


Tags: importselfgtkplaymaindefshowtable
1条回答
网友
1楼 · 发布于 2024-04-23 14:05:33

您可以按如下方式处理SIGTERM、Ctrl+C或stop按钮:

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()

我们只需保存对在clicked_play中创建的Popen对象的引用,然后使用该句柄通过click_stop中的terminate实例方法向进程发送{}。然后我们调用wait(它应该立即结束,除非timidity没有关闭SIGTERM),以获取终止的进程(这样它就不会留下僵尸)。在

我还在对gtk.main()的调用周围添加了一个try/except,这样当您发出Ctrl+C时,clicked_stop将被调用,如果收到该信号,SIGTERM处理程序也会执行相同的操作。在

相关问题 更多 >