2017-01-29 27 views
2

我試圖編寫一個應用程序時遇到了一些問題,所以我首先給出一個關於所有交互的「大圖片」描述:Qt設計器實時顯示python腳本的輸出

我有一個簡單的用Qt Designer編寫的用戶界面。這將啓動一系列對某些文件進行不同類型操作的Python腳本。所有通過打印操作都會通知用戶,但是這發生在命令行中。到目前爲止,所有的工作都是按照需要/意圖進行的。

重要提示:有時需要用戶輸入:值或只是「按任意鍵」類型的東西。再次,按照打算在cmd行中工作。

現在我想要做的就是將所有從cmd行中的python腳本出來的信息添加到Qt Designer UI中。

什麼工作:我能夠獲得蟒蛇執行的輸出,並在文本編輯對象

什麼不工作,以顯示它 : 的UI是在執行結束時只更新在腳本執行正在進行時沒有響應

我希望將ui更新爲逐行,而不是批量處理。

我如何做到這一點:

class my_ui(QtWidgets.QMainWindow): 
    ... 
    def button_pressed 
     self.__process = subprocess.Popen(cmd, stdout=subprocess.PIPE) 
     while self.__process.poll() is None: 
      line = self.__process.stdout.readline() 
      print(line) 

    def main(self): 
     ... 
     self.console_output_to_ui() 

    def write(self, text): 
     self.ui.textEdit.append(text) 

    def console_output_to_ui(self): 
     sys.stdout = self 

現在我搶輸出看起來是這樣的:

.... 
b"evaluate_condition(): '4'\r\n" 
# time delay 1s 
b"evaluate_condition(): '5'\r\n" 
# time delay 1s 
b"evaluate_condition(): '6'\r\n" 
.... 

忽略對於現在的壞格式,我想

  1. 將這個日誌逐行顯示,就像在Qt Designer UI中的cmd/debug在python中一樣,不會阻塞/鎖定UI。

  2. 找到一種方法來將參數/輸入值傳遞給正在執行的進程。我想我可能還需要定義stdin,但是如何將它從QtDesigner傳遞到進程是我無法弄清楚的。

謝謝!

回答

0

好吧,對於任何在這裏尋找第一個問題的人都可以解決。 如何:

取出sys.stdout的劫持,並用螺紋寫(刪除也寫在不需要的功能,同樣具有console_output_to_ui及其調用)取代了它:

self.__process = subprocess.Popen(cmd, stdout=PIPE, universal_newlines=True, shell=False) 
t = Thread(target=self.thread_read) 
t.start() 


def thread_read(self): 
    while self.__process.poll() is None: 
     line = self.__process.stdout.readline() 
     temp = line.lstrip() 
     temp = temp.replace("\n", "") 
     # don't print empty lines 
     if len(temp) > 1: 
      self.ui.textEdit.append(temp) 

這種方式在用戶界面文本編輯我有一個看起來像這樣的日誌:

evaluate_condition(): '6' 
evaluate_condition(): '7' 
evaluate_condition(): '8' 
evaluate_condition(): '9' 

並且它是逐行更新的,就像cmd窗口輸出一樣。

現在正在解決問題2號的問題

0

第二個問題已修復。

process.stdin.write(my_input_data + '\n') 
process.stdin.flush() 

這將其發送到子過程。

最後,儘管從子進程讀取和UI中的udpate是在一個線程中完成的。更優雅和安全。 如果有人想知道如何,請問,我可以添加更多的代碼示例。