通常很多终端执行的指令都是一直长时间运行的,这种情况如何将终端返回的结果显示在gui界面上,如:ping www.baidu.com等操作。最终目的是通过点击一个按钮,将终端的持续输出结果显示在一个文本输入框里。
# Ui_Main后的参数一定要改为QObject,否则就会提示Signal没有connect和emit这些属性
class Ui_Main(QObject):
#定义你的信号
output_str = QtCore.Signal(str)
# 按钮点击触发的函数
def start_thread(self):
# 创建线程执行函数
t1 = th.Thread(target=self.output)
print("start")
t1.start()
# 执行shell指令
def output(self):
for path in self.run("ping -c 5 google.com"):
# 发送信号,将终端的返回值作为参数
self.output_str.emit(str(path)+'\n')
# shell执行函数,支持长时间运行
def run(self, command):
process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
while True:
line = process.stdout.readline().rstrip()
if not line:
break
yield line
# 用于接受信号数据的槽函数
@Slot(str)
def update(self,str):
print(str)
# 在文本输入框末尾添加新收到的字符数据
self.textEdit.insertPlainText(str)
# 按钮点击事件绑定start_thread函数
self.pushButton.clicked.connect(self.start_thread)
# output_str信号绑定update函数
self.output_str.connect(self.update)
pyside2-uic mainwindow.ui > ui_mainwindow.py