Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 15, 2014 12:34:28

stepart
Зарегистрирован: 2014-12-15
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки в PyQT

Всем привет!
Есть проблема с реализацией потока.
Имеется форма, сделанная в 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_())

Офлайн

#2 Дек. 15, 2014 17:35:38

stepart
Зарегистрирован: 2014-12-15
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки в PyQT

Переделал код, без использования 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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version