2017-07-07 10 views
0

私はpyqtのqdialogで関数の出力を表示する際に問題があります。関数の出力をQDialogで出力する方法は? pyqtで

import sys 
import os 
import glob 
import shutil 
import json 
import datetime 
import time 
import requests 
from multiprocessing import Queue 

start_time = time.time() 

from PyQt5 import QtCore, QtGui, QtWidgets 
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QPushButton, QLabel, QScrollArea, QProgressBar, QTextEdit 

noreports = len(glob.glob('*.txt')) 

class Dialogo(QDialog): 
    def __init__(self): 
     QDialog.__init__(self) 
     self.resize(400, 380) 
     self.nombre = QLabel(self) 
     self.nombre.setGeometry(QtCore.QRect(30, 20, 171, 17)) 
     self.nombre.setObjectName("nombre") 
     self.label = QLabel(self) 
     self.label.setGeometry(QtCore.QRect(30, 50, 121, 17)) 
     self.label.setObjectName("label") 
     self.pushButton = QPushButton(self) 
     self.pushButton.setGeometry(QtCore.QRect(260, 310, 86, 28)) 
     self.pushButton.setObjectName("pushButton") 
     self.scrollArea = QScrollArea(self) 
     self.scrollArea.setGeometry(QtCore.QRect(30, 120, 341, 171)) 
     self.scrollArea.setWidgetResizable(True) 
     self.scrollArea.setObjectName("scrollArea") 
     self.scrollAreaWidgetContents = QtWidgets.QWidget() 
     self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 337, 167)) 
     self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") 
     self.scrollArea.setWidget(self.scrollAreaWidgetContents) 
     self.progressBar = QProgressBar(self) 
     self.progressBar.setGeometry(QtCore.QRect(30, 80, 341, 23)) 
     self.progressBar.setProperty("value", 0) 
     self.progressBar.setObjectName("progressBar") 
     self.textEdit = QTextEdit(self) 
     self.scrollArea.setWidget(self.textEdit) 

     self.retranslateUi(self) 
     QtCore.QMetaObject.connectSlotsByName(self) 

    def retranslateUi(self, Dialogo): 
     global noreports 
     _translate = QtCore.QCoreApplication.translate 
     self.setWindowTitle(_translate("Dialog", "Process...")) 
     self.label.setText(_translate("Dialog", "Files:" + str(noreports))) 
     self.pushButton.setText(_translate("Dialog", "Terminate")) 

class Ui_Form(object): 
    def setupUi(self, Form): 
     Form.setObjectName("Form") 
     Form.resize(321, 247) 
     icon = QtGui.QIcon() 
     icon.addPixmap(QtGui.QPixmap("../../../../api-server/favicon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 
     Form.setWindowIcon(icon) 
     Form.setWindowOpacity(0.98) 
     Form.setProperty("sunrise", QtGui.QPixmap("../../../../api-server/ejemplo.png")) 
     self.lineEdit = QtWidgets.QLineEdit(Form) 
     self.lineEdit.setGeometry(QtCore.QRect(20, 130, 281, 51)) 
     self.lineEdit.setAutoFillBackground(True) 
     self.lineEdit.setObjectName("lineEdit") 
     self.DescriptLbl = QtWidgets.QLabel(Form) 
     self.DescriptLbl.setGeometry(QtCore.QRect(20, 100, 281, 20)) 
     self.DescriptLbl.setObjectName("DescriptLbl") 
     self.showinformBtn = QtWidgets.QPushButton(Form) 
     self.showinformBtn.setGeometry(QtCore.QRect(30, 190, 161, 31)) 
     self.showinformBtn.setStyleSheet("background:rgb(110, 175, 255);\n" 
"color:rgb(36, 36, 36);\n" 
"border-radius:3px;\n" 
"border-color:black;") 
     self.showinformBtn.setObjectName("showinformBtn") 
     self.dialogo = Dialogo() 
     self.showinformBtn.clicked.connect(self.abrirDialogo) 
     #self.showinformBtn.clicked.connect(self.showinform) 
     self.CancelarBtn = QtWidgets.QPushButton(Form) 
     self.CancelarBtn.setGeometry(QtCore.QRect(220, 190, 75, 31)) 
     self.CancelarBtn.setStyleSheet("background:rgb(226, 76, 31);\n" 
"color:rgb(36, 36, 36);\n" 
"border-radius:3px;\n" 
"border-color:black;") 
     self.CancelarBtn.setObjectName("CancelarBtn") 
     self.label_2 = QtWidgets.QLabel(Form) 
     self.label_2.setGeometry(QtCore.QRect(20, 220, 311, 20)) 
     self.label_2.setTextFormat(QtCore.Qt.RichText) 
     self.label_2.setScaledContents(True) 
     self.label_2.setOpenExternalLinks(True) 
     self.label_2.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByKeyboard|QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextBrowserInteraction|QtCore.Qt.TextEditable|QtCore.Qt.TextEditorInteraction|QtCore.Qt.TextSelectableByKeyboard|QtCore.Qt.TextSelectableByMouse) 
     self.label_2.setObjectName("label_2") 
     self.showinformLbl = QtWidgets.QLabel(Form) 
     self.showinformLbl.setGeometry(QtCore.QRect(20, 30, 281, 41)) 
     font = QtGui.QFont() 
     font.setPointSize(22) 
     self.showinformLbl.setFont(font) 
     self.showinformLbl.setObjectName("showinformLbl") 
     self.imagen = QtWidgets.QLabel(Form) 
     self.imagen.setGeometry(QtCore.QRect(-80, 0, 221, 231)) 
     self.imagen.setText("") 
     self.imagen.setPixmap(QtGui.QPixmap("max.png")) 
     self.imagen.setScaledContents(False) 
     self.imagen.setIndent(-1) 
     self.imagen.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) 
     self.imagen.setObjectName("imagen") 
     self.imagen.raise_() 
     self.lineEdit.raise_() 
     self.DescriptLbl.raise_() 
     self.showinformBtn.raise_() 
     self.CancelarBtn.raise_() 
     self.label_2.raise_() 
     self.showinformLbl.raise_() 

     self.retranslateUi(Form) 
     QtCore.QMetaObject.connectSlotsByName(Form) 

    def retranslateUi(self, Form): 
     _translate = QtCore.QCoreApplication.translate 
     Form.setWindowTitle(_translate("Form", "api-server")) 
     self.lineEdit.setToolTip(_translate("Form", "<html><head/><body><p>write.</p></body></html>")) 
     self.lineEdit.setWhatsThis(_translate("Form", "<html><head/><body><p>write.</p></body></html>")) 
     self.DescriptLbl.setText(_translate("Form", "descrip inform.")) 
     self.showinformBtn.setToolTip(_translate("Form", "<html><head/><body><p>Create report.</p></body></html>")) 
     self.showinformBtn.setText(_translate("Form", "show inform")) 
     self.CancelarBtn.setToolTip(_translate("Form", "<html><head/><body><p>Cancel.</p></body></html>")) 
     self.CancelarBtn.setText(_translate("Form", "Cancel")) 
     self.label_2.setText(_translate("Form", "<html><head/><body><p>Visit api-server. ;)</p></body></html>")) 
     self.showinformLbl.setText(_translate("Form", "show inform.")) 

    def abrirDialogo(self): 
     nombreinform = self.lineEdit.text() 
     self.dialogo.nombre.setText('inform:' + nombreinform) 
     self.dialogo.show() 
     self.showinform() 

    def showinform(self): 
     current_time = datetime.datetime.today().strftime("%Y-%b-%dT%H_%M") 

     alle = glob.glob('*.txt') 
     counterfile = noreports 
     porcentotal = 0 
     suma = 100/counterfile 
     counterbien = 0 
     for file in alle: 
      porcentotal += float(suma) 
      avance = round(float(porcentotal), 0) 
      self.dialogo.progressBar.setProperty("value", format(avance)) 
      self.dialogo.textEdit.setText(file + format(avance)) 
      print ('{!r} %'.format(avance)) 
      dict = '{!r} %'.format(avance) 
      f = open(file,'w') 
      f.write('result = ' + repr(dict) + '\n') 


if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    Form = QtWidgets.QWidget() 
    ui = Ui_Form() 
    ui.setupUi(Form) 
    Form.show() 
    sys.exit(app.exec_()) 

コードが実行されますが、ダイアログにのみラベルを表示していないではなくプログレスバー:次のように

私のコードです。

どうしてですか?

+0

ペルーの挨拶をしてください。P – eyllanesc

答えて

1

問題は、format関数を使いすぎていることです。文字列があり、特定の形式のデータを挿入する場合に使用されます。

setProperty関数では、割り当てたいプロパティを最初のパラメータとして指定する必要があります。大文字と小文字の値には、プロパティを必要とする型の2番目の値に整数値が必要です。文字列に。あなたは多くのファイルを読み込む場合

は、これはあなたがQApplication.processEvents()

def showinform(self): 
    current_time = datetime.datetime.today().strftime("%Y-%b-%dT%H_%M") 

    alle = glob.glob('*.txt') 
    counterfile = noreports 
    porcentotal = 0 
    suma = 100/counterfile 
    counterbien = 0 
    for file in alle: 
     porcentotal += float(suma) 
     avance = round(float(porcentotal), 0) 
     self.dialogo.progressBar.setProperty("value", avance) 
     self.dialogo.textEdit.append("{}{}".format(file, avance)) 
     print ('{!r} %'.format(avance)) 
     dict = '{!r} %'.format(avance) 
     QApplication.processEvents() 
     f = open(file,'w') 
     f.write('result = ' + repr(dict) + '\n') 

注意を使用する必要があり、これを解決するために、GUIが描かれているメインスレッドをブロックすることができます:私はそのQTextEditappendsetText機能を変更しました追加され、上書きされません。代わりにあなたがQProgressBarsetValue機能を使用することができsetPropertyを使用しての

self.dialogo.progressBar.setValue(avance) 

もう一つの勧告は、部門の例外を発生させる可能性があるためcounterfileが非ゼロであることを確認することです。

+0

答えていただきありがとうございます。問題は、リアルタイムでそれぞれのループファイルではなく、すべて処理が完了するまでDialog textEditの結果が表示されることです。 – laur

+0

いくつのファイルがありますか?これらのファイルを共有してテストすることができます。 – eyllanesc

+0

すでに回答を更新していますので、もう一度ご確認ください。 – eyllanesc

関連する問題