Найти - Пользователи
Полная версия: PySide и потоки
Начало » GUI » PySide и потоки
1
Gennady
Суть такая. Создаю окно (не суть важно какое, обычное дело: макеты, виджеты), после инициализации элементов запускаю потомок QThread (не принципиально, чем он занят, можно time.sleep(xyz) поставить). Вопрос. Почему окно не отображается до завершения потока?

# ... imports
# ...
class Thread(QThread):
   def run(self):
      time.sleep(5)
class MainWindow(QMainWindow):
   def __init__(self):
      # ... ui
      self.thread = Thread()
      self.thread.start()
# ...
app = QApplication([])
mainwindow = MainWindow()
mainwindow.show()
sys.exit(app.exec_())

Даже если запускать поток в переопределенном методе showEvent — результат тот же. При этом, по другому опыту использования, потоки спокойно запускаются в окнах и работать им не мешают. Но вот при запуске окна такая ерунда — всю голову сломал. Конечно, можно запустить этот поток до создания главного окна, но интерфейсное решение таково, что базу данных запускать желательно уже с диалогами, с выводом настроек в главном же окне, с вариантами и так далее.

Никто не сталкивался?
agalen
Твой пример замечательно работает. Окно появляется сразу.

from PyQt4 import QtGui, QtCore
import time, sys
# ... imports
# ...
class Thread(QtCore.QThread):
   def run(self):
      print "Start"
      time.sleep(5)
      print "End"
class MainWindow(QtGui.QMainWindow):
   def __init__(self):
      super(MainWindow,self).__init__()
      # ... ui
      self.thread = Thread()
      self.thread.start()
# ...
app = QtGui.QApplication([])
mainwindow = MainWindow()
print "Continue"
mainwindow.show()
sys.exit(app.exec_())
Gennady
agalen, у меня Python 3 / PySide 1.1. Да, как ни странно, конкретный пример работает. Но мой код — нет. Перепробовал всё, закомментировал всю логику. Приложение все равно ждет, когда завершится процесс.

# весь импорт кроме PySide отключен
class StartDatabaseThread(QThread):
	end = Signal(bool)
	def __init__(self):
		super(StartDatabaseThread, self).__init__()
	def start(self):
		print('start thread')
		# логика для теста закомментирована
		time.sleep(7)
		self.end.emit(True)
		print('end thread')
class MainWindow(QMainWindow):
	def __init__(self):
		# создание интерфейса отключено
		self.databaseInit()
	def databaseInit(self):
		# оставляем только запуск потока
		self.startDatabaseThread = StartDatabaseThread()
		self.startDatabaseThread.end.connect(self.databaseStarted)
		self.databaseStart()
	def databaseStart(self):
		self.startDatabaseThread.start()
		print('thread end?')
	@Slot(bool)
	def databaseStarted(self, ok):
		# signal from thread

Код выводит:
start
end
thread end?
continue
Gennady
Вопрос снят и топик можно удалить! И совет всем друзья! Не работайте сутки на пролет! Вы можете 3 часа убить на поиск ошибочно названного метода. Конечно, у меня переопределен start(), а не run() А собирался уже к шаману идти. Мистика да и только. Случайно взгляд упал на название метода.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB