2017-04-21 1 views
-1

私のアプリケーションをビルドする際に問題があります.pqt4とPythonでGUIを作っています.QThreadを使って2秒ごとにCPU負荷をチェックし、私は進行状況バーにそれを表示したい。私のGUIは1つのクラスにあり、私のQthreadはもう1つのクラスにあります。 PyQtはクラス、私のコードPrintScreenを、私は私の他のクラスでのQObjectにQThreadに集め、私の値を渡す方法を知りたいpyqt4とpythonを使ってあるクラスから別のクラスに値を送る方法

これは私のコードです。

import sys,os,module,config_read,time,threading,datecs_print,mysql.connector as mariadb,commandList 
import psutil,logging 
from PyQt4 import QtGui, uic ,QtSql,QtCore 
from PyQt4.QtCore import QThread, SIGNAL 
import resources 
import webbrowser 
sys.stderr = open("errlog.txt", "w") 

class systemValues(QThread): 
    def __init__(self): 
     QThread.__init__(self) 

    def __del__(self): 
     self.wait() 

    def cpuRunValue(self): 
     while (1): 
      for x in range(2): 
       p = psutil.cpu_percent(1,False) 
       return p 

    def cpuProgressBarUpdate(self): 
     while(1): 
      # MyWindow.setcpuBarValue(val=77) 
      MyWindow.cpuBar.setValue(value=77) 

    def run(self): 
     # self.cpuRunValue() 
     print(self.cpuRunValue()) 
     # self.cpuProgressBarUpdate() 

class MyWindow(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QDialog.__init__(self) 
     super(MyWindow, self).__init__() 
     file_path = os.path.abspath("ui/sales_window.ui") 
     uic.loadUi(file_path, self) 
     self.myThread = systemValues() 
     self.myThread.start() 

    def setcpuBarValue(self): 
     threading.Thread(target=self.cpuBar.setValue(systemValues.cpuRunValue())).start() 

これは私のコードですが、エラーは発生しません。私は値を転送できません。私はcpuRunValue()からMyWindowのQprogressBarに行きます。私はこれにはあまり経験がありません。

PS:私は不要なコードをたくさん削除しましたが、詳細が必要な場合は教えてください。 ありがとうございます。

+0

この例では、コードをテキストに含めてください。また、エラーメッセージが何であるかを伝えてください。 – titusjan

+0

@titusjan私のコードを追加しました、それはあなたのために大丈夫ですか?何かご意見は?ありがとう、ありがとう、 –

答えて

0

Qtでスレッドを使用する場合は、スレッドをよく理解する必要があります。例えば、最初にthis pageを読んでください。確かに、QThreadをPython標準ライブラリのthreadingパッケージに混ぜてはいけません。

私はおそらくかなり新しいプログラミングだと思うなら、あなたが怒られていないことを願っています。より多くの経験があるまで、スレッドを(通常はQtで)使用しないことをお勧めします。スレッドは、経験豊富なプログラマであっても、正しく使用するのが難しいため、必要な場合にのみ使用してください。このため、スレッドに関するQtのドキュメントにはsection about alternativesも含まれています。

2秒ごとに機能を実行したい場合は、QTimerを使用し、そのtimeout信号をプログレスバーを更新するスロットに接続することをお勧めします。私はNonecpu_percentの最初のパラメータを変更したこと

#!/usr/bin/env python 

import sys 
import psutil 
from PyQt5 import QtCore, QtWidgets 

class MyWidget(QtWidgets.QWidget): 

    def __init__(self, parent=None): 

     super().__init__(parent=parent) 

     self.layout = QtWidgets.QVBoxLayout() 
     self.setLayout(self.layout) 

     self.progressBar = QtWidgets.QProgressBar() 
     self.layout.addWidget(self.progressBar) 

     self.timer = QtCore.QTimer() 
     self.timer.timeout.connect(self.updateCpu) 
     self.timer.start(100) # Every 0.1 seconds 

    def updateCpu(self): 
     cpu = psutil.cpu_percent(None, False) 
     #print("cpu = {}%".format(cpu)) 
     self.progressBar.setValue(cpu) 


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

    win = MyWidget() 
    win.show() 
    win.raise_() 
    app.exec_() 

if __name__ == "__main__": 
    main() 

注:これが好き。これにより、1秒間ではなく直ちにコールが戻ります(したがって、必要に応じてプログレスバーをより頻繁に更新できます)。 Noneに設定すると、cpu_percentの最初の呼び出しで意味のない値が返されますが、私の思うような問題ではありません。 the documentionを参照してください。

最後に、あなたが不要なコードの多くを取り除いていても、あなたのコード例では、最小限(例えばimport datecs_printがそれを実行する必要はありません、と私は、このモジュールを持っていない)、まだありませんでした。私もが完全ではありませんでした。(たとえば、 "ui/sales_window.ui"ファイルが見つからないため、実行できませんでした)how to make an MCVEのページをお読みください。私たちがちょうどコピー貼り付けることができる小さなプログラムを含めるなら、次回はもっと助けになるでしょう。

希望します。

+0

こんにちは、あなたの答えをありがとう、私はPythonには新しく、私は4ヶ月前にPythonを学び始めました。私の以前のプログラミング言語は高校でPascalでした。私はコードがあまり「プロフェッショナル」ではないことを認識しています。私はあなたの理想を実装しようとします。誰かが私に示唆したので、私はスレッドとqthreadを使用していました。 –

+0

私はあなたのidee Qtimerでアプリケーションをテストしました、それは正常に動作していない、アプリは数ミリ秒または秒の凍結していると非常に反応がありません、私はQThreadについてのあなたのリンクを読んだと私はQThreadパラレル実行用。だから私の問題は、あるクラスから別のクラスへシグナルを渡す方法をよく理解していないからです。これは、あるQtクラスから別のクラスへ値を渡すための良い方法です。あなたが私の例を助けてくれるなら、私はあなたの努力に感謝します。私は英語のネイティブスピーカーではなく、これにはあまり経験がありません。ありがとうございます –

+0

'psutil.cpu_percent'の最初のパラメータを' None'に設定してください。私の例を変更せずに実行するとどうなりますか?これも無反応ですか? – titusjan

関連する問題