我尝试使用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()我能从stop和delete_event发送中断来终止进程吗?我应该使用线程吗?
发布于 2014-07-17 14:39:27
您可以处理按下这样的SIGTERM、Ctrl+C或停止按钮:
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处理程序。
https://stackoverflow.com/questions/24806231
复制相似问题