我一直在尝试向pygtk的进度栏添加取消按钮,但是现在可以使用该功能了.该功能的作用是执行和编写脚本,输出中的每一行都对其进行计数,并将其添加到progressBar中.我的问题是如何取消该子流程,有办法吗?def stop(self,...

我一直在尝试向pygtk的进度栏添加取消按钮,但是现在可以使用该功能了.该功能的作用是执行和编写脚本,输出中的每一行都对其进行计数,并将其添加到progressBar中.我的问题是如何取消该子流程,有办法吗?
def stop(self, widget):
print "cancelar"
os.killpg(self.p.pid, signal.SIGTERM) #=> not working
self.p.kill() #=> not working
count = 0
command = "script.sh"
self.p = subprocess.Popen(command, shell=True, bufsize=0, stdout=subprocess.PIPE, universal_newlines=True)
for line in iter(self.p.stdout.readline, ""):
count = count + 1
while gtk.events_pending():
gtk.mainiteration()
gobject.timeout_add(1000, self.update)
porcentaje = float(count) / float(1400)
print porcentaje
self.progress.set_text(str(int(porcentaje * 100)) + "%")
self.progress.set_fraction(porcentaje)
解决方法:
下面的示例应该完成您所希望的一切(希望),它将在两个textview中打印长时间运行的命令的输出,顶部是stdout,底部是stderr.
您可以使用“停止”按钮取消该过程,进度将停止跳动.
同时,UI不应在不使用线程的情况下冻结,它也应该在Windows上运行(虽然不太确定,但我很有信心,但我会很有信心),但是您当然必须在其他地方更改“ du”.
它使用GTK3,因此带有自省功能的pygobject(您也应该使用它…),但是如果您真的想使用PyGTK,则移植起来应该非常简单.
from gi.repository import Gtk, GLib
import os, signal
class MySpawned(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.set_default_size(600,600)
vb = Gtk.VBox(False, 5)
self.tw_out = Gtk.TextView()
sw = Gtk.ScrolledWindow()
vb.pack_start(sw, True, True, 0)
sw.add(self.tw_out)
self.tw_err = Gtk.TextView()
sw = Gtk.ScrolledWindow()
vb.pack_start(sw, True, True, 0)
sw.add(self.tw_err)
self.progress = Gtk.ProgressBar()
vb.pack_start(self.progress, False, True, 0)
bt = Gtk.Button('Run')
bt.connect('clicked', self.process)
vb.pack_start(bt, False, False, 0)
bt = Gtk.Button('Stop')
bt.connect('clicked', self.kill)
vb.pack_start(bt, False, False, 0)
self.add(vb)
self.set_size_request(200, 300)
self.connect('delete-event', Gtk.main_quit)
self.show_all()
def run(self):
Gtk.main()
def update_progress(self, data=None):
self.progress.pulse()
return True
def kill(self, widget, data=None):
os.kill(self.pid, signal.SIGTERM)
def process(self, widget, data=None):
params = ['du', '--si', '/']
def scroll_to_end(textview):
i = textview.props.buffer.get_end_iter()
mark = textview.props.buffer.get_insert()
textview.props.buffer.place_cursor(i)
textview.scroll_to_mark(mark, 0.0, True, 0.0, 1.0)
def write_to_textview(io, condition, tw):
if condition is GLib.IO_HUP:
GLib.source_remove(self.source_id_out)
GLib.source_remove(self.source_id_err)
return False
line = io.readline()
tw.props.buffer.insert_at_cursor(line)
scroll_to_end(tw)
while Gtk.events_pending():
Gtk.main_iteration_do(False)
return True
self.pid, stdin, stdout, stderr = GLib.spawn_async(params,
flags=GLib.SpawnFlags.SEARCH_PATH|GLib.SpawnFlags.DO_NOT_REAP_CHILD,
standard_output=True,
standard_error=True)
self.progress.set_text('Running du --si')
io = GLib.IOChannel(stdout)
err = GLib.IOChannel(stderr)
self.source_id_out = io.add_watch(GLib.IO_IN|GLib.IO_HUP,
write_to_textview,
self.tw_out,
priority=GLib.PRIORITY_HIGH)
self.source_id_err = err.add_watch(GLib.IO_IN|GLib.IO_HUP,
write_to_textview,
self.tw_err,
priority=GLib.PRIORITY_HIGH)
timeout_id = GLib.timeout_add(100, self.update_progress)
def closure_func(pid, status, data):
GLib.spawn_close_pid(pid)
GLib.source_remove(timeout_id)
self.progress.set_fraction(0.0)
GLib.child_watch_add(self.pid, closure_func, None)
if __name__ == '__main__':
s = MySpawned()
s.run()
本文标题为:python-子进程PYGTK中的按钮Stop / Cancel progressBar


基础教程推荐
- 关于pycharm python3.7成功安装dlib库的问题 2023-08-04
- 浅析Python __name__ 是什么 2023-08-08
- 【廖雪峰老师python教程】——进程与线程 2023-09-05
- python2 logging模块在多进程和多线程混用下的一个坑 2023-11-12
- Python 文档解析lxml库的使用详解 2022-10-20
- Python实现字符串匹配算法代码示例_python_脚本之家 2023-09-04
- 在AWS Lambda上将ImageMagick作为python子进程运行 2023-11-11
- python机器学习Github已达8.9Kstars模型解释器LIME 2023-08-09
- Centos7中安装python3 2023-11-12
- 深入了解Python中的时间处理函数 2023-08-11