2017-07-07 71 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

問題是,您正在使用格式函數糟糕,這是用來當你有一個字符串,你想插入數據與特定的格式。

setProperty函數需要第一個參數爲要分配的屬性,第二個需要該屬性的類型值,在您的情況下值需要一個整數值,因此您可以直接傳遞百分比而無需更改它串起來。

如果你看了很多文件可以阻隔在GUI繪製爲主線,以解決這個問題,你必須使用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') 

注:我已經改變了setText功能appendQTextEdit使它被添加並且不被覆蓋。

而不是使用setProperty你可以使用的QProgressBarsetValue功能:

self.dialogo.progressBar.setValue(avance) 

另一項建議是,以驗證counterfile不爲零,因爲它可能產生的分裂異常。

+0

感謝您的回答,問題是它顯示了對話框中的結果textEdit,直到它們全部完成處理,並且沒有實時顯示每個循環文件​​。 – laur

+0

你有多少個文件?你可以分享這些文件來測試它們。 – eyllanesc

+0

已經更新我的回答,請回頭查看。 – eyllanesc