繁体   English   中英

在pyqt4滚动区域python中显示长循环函数

[英]Displaying a long loop function in pyqt4 scroll area python

我正在设计一个GUI,并且作为GUI的一部分,我想以一种特殊的方式检索数据并将其显示在滚动区域上。 但是我不确定该怎么做,我已将数据库检索功能定义为cpu_alert,但是如何将结果(行)放在滚动区域中? 请看一看代码。

from PyQt4 import QtCore, QtGui
import ui_intex_server_monitorui as intex
from PyQt4 import Qt
import sys
import os
import MySQLdb as mdb

class MyMain(QtGui.QMainWindow, intex.Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyMain, self).__init__(parent)
        self.setupUi(self)  

        #Exit Button
        self.connect(self.pushButton_2, QtCore.SIGNAL('clicked()'),
            self.close)
        #Refresh Button here#
        self.testdata = QtGui.QListWidget(self)
        layout = self.scrollArea_10
        layout.setWidget(self.testdata)
        self.testdata.addItem(self.cpu_alert.rows)

def cpu_alert():
    control = True

    while (control == True):

        f = open("connection_cpu.txt","r")
        a = f.read()
        con = mdb.connect('server', 'user', 'pass', 'db')

        if a == "CPU Overload":
            with con: 
                cur = con.cursor()
                cur.execute("""SELECT *
                               FROM cpu_alert
                               WHERE date = (SELECT MAX(date) FROM cpu_alert)""")
                rows = str(cur.fetchone())
                rows = rows.strip("()" "''")
                open("connection_cpu.txt","w").close()
      return rows


def main():
   app = QtGui.QApplication(sys.argv)
   app.setStyle(QtGui.QStyleFactory.create("plastique"))
   main_window = MyMain()
   main_window.show()
   app.exec_()

if __name__ == '__main__':
   main()

首先,让我开始讨论您如何检查是否有新的更新。 如果要调用此cpu_alert方法,则将在主线程中进入繁忙循环,并阻止许多GUI功能。 此外,没有任何限制此繁忙循环的功能,因此它将在文件上快速旋转。 假设检查文件内容是您打算使用的方法,则需要将其放在单独的线程中。 线程将在文件上循环并休眠合理的时间。 如果找到所需的文本,则可以发出信号。 然后,该信号将连接到更新表的插槽。

但是,让它变得更加简单,因为您要检查的所有内容都是快速读取文件。 因为不需要花费很多时间,所以我们可以使用QTimer。 计时器将触发并致电检查程序。 如果检查器找到并更新了它,则可以直接调用表更新,或者使其更健壮,您只需发出一个信号即可。

这是一个完整的示例,之后我将对其进行细分:

from PyQt4 import QtGui, QtCore, QtSql
import time

class Window(QtGui.QDialog):

    update_ready = QtCore.pyqtSignal()

    def __init__(self):
        super(Window, self).__init__()

        self.layout = QtGui.QVBoxLayout(self)
        self.table = QtGui.QTableView()
        self.layout.addWidget(self.table)

        self.db = QtSql.QSqlDatabase.addDatabase("QMYSQL")
        self.db.setHostName("server")
        self.db.setDatabaseName("db")
        self.db.setUserName("user")
        self.db.setPassword("pass")
        self.db.open()

        self.model = QtSql.QSqlTableModel(self, self.db)
        self.model.setTable("cpu_alert")
        self.model.setEditStrategy(self.model.OnManualSubmit)
        self.model.setQuery(QtSql.QSqlQuery("""
            SELECT *
            FROM cpu_alert
            WHERE date = (SELECT MAX(date) FROM cpu_alert)"""))
        self.model.select()

        self.table.setModel(self.model)

        self.button = QtGui.QPushButton("Select")
        self.layout.addWidget(self.button)

        self.button.clicked.connect(self.model.select)
        self.update_ready.connect(self.model.select)

        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.cpu_alert_checker)
        # check every second
        self.timer.start(1000*1)

        # this is only for the temp time test
        self._now = time.time()

    def cpu_alert_checker(self):
        # You would do whatever check you want 
        # in this function
        if time.time() - self._now > 5:
            print "Update ready!"
            # emit this signal if the table should refresh
            self.update_ready.emit()
            self._now = time.time()

无需执行原始驱动程序查询,您可以使用内置的QSql创建自动驱动表的模型。 有很多选项可以设置表格和模型应如何显示每一行。 但我将其保留为基本内容。

我创建一个按钮并将其连接到sql模型上的select()。 我还创建了QTimer,并将其超时设置为调用您的cpu_alert_checker()。 我们启动计时器,以便每秒钟触发一次。 您可以根据自己的喜好调整此速度。

当超时触发时,cpu_alert_checker中的代码将运行。 我只是在其中放置一个时间计数器作为占位符,以使测试更易于查看。 时间过了5秒钟,它将启动并重置。 您会看到我们已经定义了一个称为update_ready的自定义信号。 我们可以对此进行发射,并与之连接。 它使您的检查器更加强大,因为它不必直接知道该功能。 它可以仅通知您的应用程序已准备就绪。

我希望这个例子能对您有所帮助。 我认为以这种方式进行管理要容易得多。 如果您的检查器正在做很多繁重的工作,则需要将其移动到QThread上以免阻塞主线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM