Python中文
首页
教程
问答
标签
搜索
登录
注册
在不阻塞主循环的线程中运行bash脚本
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>我有一个python程序,当我在线程中运行bash脚本并显示一些消息时,它需要一个progressbar脉冲。在</p> <p>当我单击一个按钮时,线程开始启动脚本,但是消息和进度条只有在线程完成时才会响应,只显示最后一条消息。在</p> <p>在阅读时,我明白我在阻塞主循环,但我不知道如何解决这个问题。在</p> <p>我的程序的简化代码,问题是当调用“on_fixme_button_pressed”时:</p> <pre><code>from gi.repository import Gtk, Gdk, Pango, GObject, GLib import os, sys import xml.etree.ElementTree as etree from urllib.request import urlopen from subprocess import Popen import threading UI_FILE = "remendo_gtk.ui" #UI_FILE = "/usr/local/share/remendo_gtk/ui/remendo_gtk.ui" GObject.threads_init() class GUI: def __init__(self): self.builder = Gtk.Builder() self.builder.add_from_file(UI_FILE) self.builder.connect_signals(self) self.window = self.builder.get_object('remendo') self.event_treeview = self.builder.get_object('event_treeview') self.event_info = self.builder.get_object('event_info') self.progressbar = self.builder.get_object('progressbar') self.progressbar_lock = threading.Lock() self.selected_event = '' self.url_script = '' self.local_script = '' self.window.connect("destroy", lambda _: Gtk.main_quit()) self.set_event_list() self.window.show_all() def pulse_progressbar(self): if threading.active_count() > 1: self.progressbar.pulse() return True self.progressbar.set_fraction(0.0) self.progressbar_lock.release() return False def on_fixme_button_clicked(self, button): self.event_info.set_label("Fixing now...") script = threading.Thread(target=self.run_script(), args=(self,)) script.start() if self.progressbar_lock.acquire(False): GLib.timeout_add(250, self.pulse_progressbar) def run_script(self): try: self.local_script = '/tmp/%s.sh' % self.selected_event.replace(" ", "_") script = urlopen(self.url_script) localscript = open(self.local_script, 'wb') localscript.write(script.read()) localscript.close() command = ['bash', self.local_script] p = Popen(command) p.communicate() #self.event_solved() self.event_info.set_label("My work is done. Good day!") except: self.event_info.set_label("Script failed: %s" % self.local_script) return False def main(): app = GUI() Gtk.main() if __name__ == "__main__": sys.exit(main()) </code></pre>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>最后用GObject.timeout_添加使用threaded类中的变量更新消息的状态,以知道进程何时完成,并使用@johanlundberg建议的<code>.communicate()</code>选项</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
文本导入时标题行中的特殊字符
1 回答
文本小部件:在没有输入时更新并在循环后保持空闲
2 回答
文本小部件tkin
10 回答
文本小部件tkinter中的标签更改或文本外观更改是否有撤消功能?
4 回答
文本小部件tkinter复制图像选项
7 回答
文本小部件上的Python Tkinter ttk滚动条未缩放
8 回答
文本小部件上的滚动条可能需要根据制表符ord显示前进行滚动
7 回答
文本小部件不显示lis中的内容
3 回答
文本小部件不显示Unicode字符
1 回答
文本小部件中写入的行间距
7 回答
文本小部件中的文本作为变量
2 回答
文本小部件中的滚动条仅显示在底部
1 回答
文本小部件中的选项卡键空间计数
4 回答
文本小部件作为Lis
3 回答
文本小部件在主框架中扩展列宽
7 回答
文本小部件未使用删除功能清除
4 回答
文本小部件滚动动画(Tkinter、Python)
2 回答
文本居中。格式正确吗?
3 回答
文本差分算法
9 回答
文本已知时音频文件中的单词索引
2 回答