Python PyQt5運行程序把輸出信息展示到GUI圖形界面上

概述:最近在趕畢業設計,遇到一個問題,爬蟲模塊我用PyQt5寫了圖形界面,爲了將所有的輸出信息都顯示到圖形界面上遇到了問題。

先演示一下效果最終效果吧,下面兩張圖用來鎮樓。可以看到我們圖形界面和程序運行的返回的信息是一樣的,並且成功把數據展示到圖形界面。

    

 

 

 

      1.怎麼獲取輸出信息。eg:我們平時用編譯器,例如pycharm,運行的時候,會有很多信息,或者直接在cmd窗口輸入命令的時候,也有同樣信息。例如我啓動數據庫。

                           

                            cmd窗口下執行命令返回的信息                                                              Pycharm運行的效果

我就想把這種類似輸出的信息,展示到圖形界面上,上面這兩種方法本質都是一樣的,都是在向用mysql 命令net start mysql啓動的,前面是在cmd窗口下,後一種是用os.sysytem("net start mysql")。

    2.怎麼把信息發送給圖形界面展示。

解決方案: 

對於問題1,需要用到PyQt其中一個模塊 :subprocess。看名字大概可以猜到是新開一個進程去執行某些功能。由於我是結合網上資料和源碼進行運用的, 大概簡單說一些吧。

官方源碼中這麼說的:

This module allows you to spawn processes, connect to their
input/output/error pipes, and obtain their return codes.

 

翻譯過來就是:該模塊允許您生成進程,連接到其輸入/輸出/錯誤管道  並獲取其返回碼。

意思就是新開一個進程去執行功能,返回狀態碼,以及信息。這裏要想像cmd裏面或者pycharm運行那樣,得到裏面的輸出數據,就要用到subprocess.Popen(cmd),或者subprocess.getstatusoutpu(cmd),subprocess.getoutpu(cmd)。都能獲取到輸出的日誌信息,cmd是字符串命令。博主這裏用的subprocess.get系列。就實例話展示一下。

subprocess.getoutput(cmd):返回的是在Linux shell或者windows cmd窗口執行命令返回信息。例如啓動數據庫。
import subprocess

reply=subprocess.getoutput("net start mysql")
print(reply)

subprocess.getstatusoutput(cmd):返回的是在Linux shell或者windows cmd窗口執行命令返回狀態碼和信息。比上面命令多了一個狀態碼,狀態碼爲0代表執行成功,其餘值就是失敗。每個值對應一種錯誤
import subprocess

reply=subprocess.getstatusoutput("net start mysql")
print(reply)

對於上面兩種情況,如果你需要狀態碼和信息就用第二種,只需要返回信息就用第一種。博主用的第二種,因爲我需要狀態碼判斷是否成功,因爲我的圖形界面有消息盒子需要判斷。當然你可以根據個人情況而定。

 

對於問題2:我這裏採用是Pyqt中的信號機制,我把所有信息用信號發送出去,在用信號函數接收,連接槽函數再顯示,因爲我的功能比較多,所以需要顯示的數據,都用信號發出去。當然你的功能單一的話,你可以直接用上面的模塊,得到返回信息顯示就行。比如我這裏,有測試功能,連接數據庫,關閉數據庫等,我就展示其中一個具體的例子演示。

  1. 首先得在一個類中定義信號   eg:show_infoes_signal=pyqtSignal(str)  str是參數
      #自定義信號,發送日誌信息,展示到界面
        show_infoes_signal=pyqtSignal(str)

     

  2. 在類中init初始化中寫接收信號,連接槽函數。show_infoes是寫的展示函數
     def __init__(self):
           
            self.show_infoes_signal.connect(self.show_infoes)

     

  3. 比如在某個具體功能中發送信號,並把信息用哪個信號傳出去。例如我的連接數據庫的功能。
     def connect_mysql(self):
            self.show_infoes_signal.emit("連接數據庫ing....")
            reply=subprocess.getstatusoutput("net start mysql")
            #subprocess返回狀態碼和字符串元組,0成功,其餘值失敗
            if reply[0]==0:
                # 發送數據信號
                self.show_infoes_signal.emit(reply[-1])
                QMessageBox.information(self, "消息", "Congratulation! 數據庫連接成功!")
            else:
                self.show_infoes_signal.emit(reply[-1])
                QMessageBox.warning(self, "警告", "連接失敗")

    在連接數據庫功能中,用新進程打開,看狀態碼是否爲0,爲0啓動成功,發送信號並且消息盒子提示連接成功,否則連接失敗。

  4. 最後就是展示的槽函數。當我們發送信號後,就能接收到發送的信號以及信息,最後把拿到的信息進行展示。

  #展示信息槽函數
    def show_infoes(self,info):
        print(info)
        pre_text=self.show_label.text()
        self.show_label.setText(pre_text+info+'\n\n')

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章