Форум сайта python.su
0
Всем привет!
Есть проблема с реализацией потока.
Имеется форма, сделанная в Designer. На форме есть treeWidget и подключенная к нему таблица MySQL. Нужно чтобы при нажатии кнопки эта таблица начала периодически обновляться не замораживая главное окно формы. Я так понял, функцию обновления нужно вывести в отдельный поток. Попробовал реализовать так, с помощью SimpleThread но по нажатию кнопки pushButton2 ничего не происходит. Что я делаю не так? Как можно реализовать это как-то по-другому?
from PyQt4 import QtCore, QtGui, uic import DB_manager, sys import socket import time from threading import Lock, Thread, Event from simple_thread import SimpleThread reload(sys) sys.setdefaultencoding('cp1251') class MainWindow(QtGui.QMainWindow): def __init__(self, database, tableName): QtGui.QMainWindow.__init__(self) uic.loadUi('form.ui', self) self.pushButton.clicked.connect(self.pushButton_Click) self.pushButton2.clicked.connect(self.pushButton2_Click) self.dbu = DB_manager.DatabaseUtility(database, tableName) self.UpdateTree() def pushButton_Click (self): HOST = self.lineEdit2.text() PORT = 2014 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.connect((HOST, PORT)) sock.send("00000000"+"\0") data = sock.recv(1024) print data sock.close() @SimpleThread def UpdateTree(self): while True: col = self.dbu.GetColumns() table = self.dbu.GetTable() for c in range(len(col)): self.treeWidget.headerItem().setText(c, col[c][0]) self.treeWidget.setHeaderLabels([u'первый',u'второй',u'третий',u'четвертый']) self.treeWidget.clear() for item in range(len(table)): QtGui.QTreeWidgetItem(self.treeWidget) for value in range(len(table[item])): self.treeWidget.topLevelItem(item).setText(value, str(table[item][value])) sleep(1) def pushButton2_Click (self): self.UpdateTree() if __name__ == '__main__': app = QtGui.QApplication(sys.argv) db = 'ppkbase77' tableName = 'id2222' w = MainWindow(db, tableName) QtCore.QObject.connect(w.pushButton2,QtCore.SIGNAL("clicked()"),w.pushButton2_Click) w.pushButton2_Click() w.show() sys.exit(app.exec_())
Офлайн
0
Переделал код, без использования SimpleThread. Программа запускается и таблицу обновляет, но после нескольких проходов цикла в потоке, она вылетает и выдает в консоль ошибку
QObject::connect: Cannot queue arguments of type ‘Qt::Orientation’
(Make sure ‘Qt::Orientation’ is registered using qRegisterMetaType().)
Как можно сделать так, чтобы программа не вылетала и не выдавала ошибку?
# coding: cp1251 from PyQt4 import QtCore, QtGui, uic import DB_manager, sys import socket import time from threading import Lock, Thread, Event reload(sys) sys.setdefaultencoding('cp1251') class MainWindow(QtGui.QMainWindow): def __init__(self, database, tableName): QtGui.QMainWindow.__init__(self) uic.loadUi('form.ui', self) self.pushButton.clicked.connect(self.pushButton_Click) self.pushButton2.clicked.connect(self.pushButton2_Click) self.dbu = DB_manager.DatabaseUtility(database, tableName) self.UpdateTree() def pushButton_Click (self): HOST = self.lineEdit2.text() PORT = 2014 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.connect((HOST, PORT)) sock.send("12345678"+"\0") data = sock.recv(1024) print data sock.close() def UpdateTree(self): col = self.dbu.GetColumns() table = self.dbu.GetTable() for c in range(len(col)): self.treeWidget.headerItem().setText(c, col[c][0]) self.treeWidget.setHeaderLabels([u'первый',u'второй',u'третий',u'четвертый']) self.treeWidget.clear() for item in range(len(table)): QtGui.QTreeWidgetItem(self.treeWidget) for value in range(len(table[item])): self.treeWidget.topLevelItem(item).setText(value, str(table[item][value])) def pushButton2_Click (self): self.UpdateTree() #class TaskCore (QtCore.QThread): # def classname(self): # return self.__class__.__name__ class Task1(QtCore.QThread): def run(self): while True: w.UpdateTree() time.sleep(15) if __name__ == '__main__': app = QtGui.QApplication(sys.argv) db = 'ppkbase77' tableName = 'id2222' w = MainWindow(db, tableName) t1 = Task1() t1.start() w.show() sys.exit(app.exec_())
Отредактировано stepart (Дек. 15, 2014 17:36:16)
Офлайн