2016-09-18 28 views
0

我有一個Python控制檯程序,我想轉移到GUI。 我想過使用PyQt 5,但我願意選擇。如何翻譯Python控制檯程序(包括while循環)到PyQt?

簡化控制檯代碼如下所示:

while True: 
    data = obtain_data_from_device(source) 
    print(datatotext(data)) 

現在從我個人理解,GUI代碼的工作不同。 但是,如何使用可能需要0.5到30秒的任何時間的obtain_data_from_device函數來持續更新PyQt中的文本框?

While循環無法完成它,因爲它擰緊了GUI,定時器不起作用,因爲持續時間是可變的。

我會很感激任何提示。

+0

你可以把這個循環變成一臺發電機和'yield'(而不是'打印')的結果?然後你可以通過'for'循環調用生成器,使用yield'ed值來更新GUI。 – cdarke

回答

0

你可以嘗試這樣的事:

import sys 
import random 
import time 
import string 

from PyQt5 import QtWidgets, QtCore 


def obtain_data_from_device(source): 
    time.sleep(0.001) 
    data = ''.join(random.choice(string.ascii_uppercase + string.digits) 
        for _ in range(len(source))) 
    return data 


class Main(QtWidgets.QMainWindow): 

    def __init__(self): 
     QtWidgets.QMainWindow.__init__(self) 
     self.init_ui() 

    def init_ui(self): 

     self.timer = QtCore.QTimer(self) 
     self.timer.timeout.connect(self.time) 
     self.timer.start(0) 

     self.lcd = QtWidgets.QLineEdit(self) 
     self.lcd.setText(
      obtain_data_from_device("whatever data you're capturing")) 

     self.setCentralWidget(self.lcd) 

     self.setGeometry(300, 300, 250, 100) 
     self.setWindowTitle("Displaying capture data from device") 

    def time(self): 
     self.lcd.setText(
      obtain_data_from_device("whatever data you're capturing")) 


def main(): 
    app = QtWidgets.QApplication(sys.argv) 
    main = Main() 
    main.show() 

    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main() 

你只需要通過你替換現有obtain_data_from_device。

+0

這會阻止gui - 用'time.sleep(5)'試試它。 – ekhumoro

+0

非常感謝那些代碼。 它具有我需要的大部分功能。 但有一個問題:因爲我的函數obtain_data_from_device需要0.5到30秒才能返回,所以程序/ GUI不起作用。 在我的Mac上,我永久地看到「凍結的程序」符號(滾動的彩色鼠標),並且該程序無法真正正確使用。 有什麼建議嗎?我們是否需要將obtain_data_from_device放入單獨的線程中? – Holger

+0

更改爲time.sleep(5) 只會導致凍結10秒,好一點,再次凍結5秒,等等...... – Holger

1

因爲您已經有一個寫入STDOUT的工作程序,因此一種選擇是讓GUI程序使用QProcess作爲子進程運行控制檯程序。

的孩子將在GUI程序的控制和GUI程序異步運行將通過信號接收孩子的輸出,即無阻塞