Python и PyQt класс Qthread пример многопоточности

  Рет қаралды 13,707

PyScientist

PyScientist

5 жыл бұрын

Это видео продолжает серию видео-записок по Python с обзорами практических приёмов программирования.
В этой видео-заметке продолжаю обзор возможностей PyQt5, а именно разбираю приемы программирования с использованием нескольких потоков посредством класса QThread. При этом QThread - это не поток, а Qt обертка для потока конкретной ОС, которая позволяет взаимодействовать с потоком из Qt проекта, в первую очередь через Qt signals/slots. Здесь покажу как организовать код, чтобы избежать залипания программы при длительных вычислениях или загрузке большого количества информации, упомяну и другие варианты применения программ с двумя и более потоками.
Подробнее c этими и дополнительными материалами можно ознакомится на Портале: PyScientist pyscientist.ucoz.net
Если у Вас есть какие либо вопросы по видео, либо по работе исходного кода, предложения по сотрудничеству буду рад с Вами взаимодействовать, пожалуйста обращайтесь на e-mail: sergei-dmitriev@mail.ru, либо пишите в комментарии к видео.
Ссылки на предыдущие видео по теме:
Видео 1: Python настройка рабочего пространства, использование PyCharm
• Python и PyCharm(IDE) ...
Видео 2: Python функции
• Python функции tutoria...
Видео 3: Python классы
• Python и классы на при...
Видео 4: Графический интерфейс Qt для Python, или PyQt
• Python и Qt библиотека...
Видео 5: Python компиляция программ, cx_Freeze и другие компиляторы
• Python exe tutorial ко...
Видео 6.1: Библиотека Matplotlib создание графиков для анализа данных
• Python Matplotlib граф...
Видео 6.2: Библиотека matplotlib и Qt встраивание графиков в графический интерфейс Qt
• Python и Matplotlib py...
Видео 7: Matplotlib модуль Animation класс FuncAnimation (автообновление графиков)
• Python и Matplotlib мо...
Видео 8: Библиотека Matplotlib, отображение графиков функции с использованием библиотеки numexpr (ввод функции из текстовой строки) • Python и Matplotlib py...
Видео 9.1: Классы QListWidget и QListView сопоставительный анализ, простой пример применения QListWidget
• Python и PyQt (QListWi...
Видео 9.2: Класс QListView пример применения с использованием QtCore.QabstractListModel
• Python PyQt и QListV...
Видео 10: Python и Excel взаимодействие с excel (библиотеки xlrd, xlwt, openpyxl, win32com)
• Python и Excel (библио...
Видео 11: обзор виджета QTableWidget и практическое использование
• Python и PyQt обзор ви...
Видео №12.1 обзор виджета QStackedWidget использование QComboBox и QPushButton в качестве переключателей
• Python и PyQt QStakedW...
Видео №12.2 Продолжение обзора виджета QStackedWidget использование QToolButton в качестве переключателей, настройка статического и динамического внешнего вида QToolButton c использованием qss.
• Python и PyQt QStakedW...
Видео 12.3 Python готовое приложение с графическим интерфейсом (GUI) Qt и графической библиотекой Matplotlib (Обзор проекта текущее состояние на июль 2018г). • Python и готовое прило...
Видео 13.1 Python и создание базы данных данных на движке СУБД sqlite3 с использованием стандартной библиотеки.
• Python и sqlite создан...
Видео 13.2 Python и sqlite3 внесение изменений в базу данных (СУБД SQLite), практический пример управления данными в базе
• Python и sqlite3 внесе...
Видео 13.3 Python и sqlite3 хранение изображений в базе данных с СУБД SQLite, практический пример.
• Python и sqlite3 хране...
Видео 13.4 Python и sqlite3 интеграция функционала базы данных в проект PyScientistNotes. (скоро появится)
Видео 14 Python и Qt обзор переход с PyQt4 на PyQt5 и далее на PySide2
• От PyQt4 к PyQt5 и дал...
Видео 15 Python и Qt стандартные диалоговые окна tutorial
• Python и Qt стандартны...
Видео 16 Python и PyQt "QDialog" - создание и настройка диалогового окна
• Python и PyQt "QDialog...
Видео 1S Matplotlib настройка axes для простого графика
• Video
Видео 2S Python и интерполяция в numpy и scipy
• Video
Видео 3S Python и буфер обмена windows (текстовые данные)
• Python и буфер обмена ...
Видео 17 Python и PyQt класс Qthread пример многопоточности
• Python и PyQt класс Qt...
В видео использованы следующие аудио материалы:
композиция Timeless исполнитель Constantine 2018г дабстеп.

Пікірлер: 93
@Sinetilya2
@Sinetilya2 4 жыл бұрын
Коротко и ясно. Спасибо за видео! Благодаря вам теперь могу в прямом эфире отслеживать положение лазерного сканера, что-бы выставлять его перпендикулярно. Раньше постоянно тыкал в кнопку для обновления информации :) Надеюсь стану таким же умным :D
@user-qz9dk1uj2k
@user-qz9dk1uj2k 4 жыл бұрын
Давно надо было поменять тему. Ночью глаза вытекают с белой темы
@SergMirny_yt
@SergMirny_yt 4 жыл бұрын
Спасибо за урок. Полезно
@Jurlex
@Jurlex Жыл бұрын
друг, спасибо, объяснения не очень понял, но порылся в коде и все получилось
@vasyaklishch4184
@vasyaklishch4184 4 жыл бұрын
сделайте видео о том как работать с сигналами и слотами... ах да чуть не забыл Спасибо большое за такие видео. Побольше бы таких людей которые адекватно обьясняют
@user-fr5mg7vl8e
@user-fr5mg7vl8e 4 жыл бұрын
Плюсую
@legenov-mihail
@legenov-mihail 5 жыл бұрын
Мне понравилось. И да, чёрный вариант мне кажется красивее.
@VladKrinitsin
@VladKrinitsin 6 ай бұрын
Спасибо, дружище! Только этот видос и помог мне разобраться в ситуации. Осталось только адаптировать это решение под мой код, но надеюсь, что я смогу это сделать
@swartex92
@swartex92 4 жыл бұрын
Годно объяснил) спасибо!
@PyScientist
@PyScientist 4 жыл бұрын
Как в комментариях писали - лучше реализовывать многопоточность при изменении состояний виджетов через сигналы. Иначе можно поймать ошибку! То-есть при простом статус баре ещё проканает, а вот если, что-то более сложное, то могут быть проблемы. Кстати если нужна многопоточность или, что немного интереснее многопроцессность, не только в pyqt, то рекомендую присмотреться к threading и concurrent.futures. Они просты в использовании и черезвычайно эффективны.
@shaltayb0ltay
@shaltayb0ltay 2 жыл бұрын
Пример неверный. Недопустимо обращаться к элементам интерфейса из другого потока. Как верно пишут в комментариях, необходимо послать сигнал/событие из рабочего потока с долгими вычислениями в основной поток, что обрабатывает интерфейс. см. работу с signal в kzbin.info/www/bejne/oWbXep5trJpjgpY
@PyScientist
@PyScientist 2 жыл бұрын
В этом видео перемудрил. Получилось видео как делать не надо. Спасибо за комментарий.
@ivanpesotsky999
@ivanpesotsky999 4 жыл бұрын
Подскажите, пожалуйста,откуда взялся mainwindow? Как он стал экземпляром класса myprogressbarwindow? Явное должно быть присваивание: mainwindow =myprogressbarwindow()
@muradaliev4500
@muradaliev4500 5 жыл бұрын
спасибо Сергей. был бы признателен, если было бы больше видео про петрофизику с python
@PyScientist
@PyScientist 5 жыл бұрын
Мурад, Вас понял! Будет и по петрофизике! Это мой конёк)
@muradaliev4500
@muradaliev4500 5 жыл бұрын
PyScientist Notes спасибо большое! Это очень интересно. Я написал вам на почту, гляньте, когда будет время, пожалуйста.
@SergMirny_yt
@SergMirny_yt 4 жыл бұрын
С этим понятно. А как вернуть данные из потока параллельного? И если запускаешь экземпляр внешнего класса. В каком потоке работает этот экхемпляр в потоке родителя или в основном потоке?
@user-wz5uw6vm2k
@user-wz5uw6vm2k 6 ай бұрын
Пытаюсь читать звук со звуковой карты в qthread - падает с ошибкой. В обычном потоке работает, но программа висит. Виндоус 11
@c_i_k_a_d_a5009
@c_i_k_a_d_a5009 5 жыл бұрын
Здравствуйте! Подскажите, пожалуйста, можно ли вывести таблицы данных из postgresql в таблицы PyQt? Т.е. визуализировать данные в графическом интерфейсе? И каким образом это можно реализовать?
@PyScientist
@PyScientist 5 жыл бұрын
День добрый, тут вопрос больше не в том как импортировать PostgreSQL в pyqt. А как работать в python с PostgreSQL. Например, можно воспользоваться для этого psycopg2 это довольно удобная библиотека для работы с Python с базами данных postgreSQL. Ну а после того как разберётесь как импортировать данные, о поместить их в таблицу qtablewidget или qtableview не составит труда. Синтаксис похож на sqlite3 смотрите видео 13.1, про таблицы pyqt (qtablewiget) можно также узнать в моих видео, смотрите ссылки на предыдущие видео в описании!
@user-yd2tl1pl1k
@user-yd2tl1pl1k 5 жыл бұрын
Выражение, эквивалентное time.sleep(0.2), дружественному к PyQt, выглядит следующим образом: QtCore.QThread.msleep(200)
@PyScientist
@PyScientist 5 жыл бұрын
Николай, спасибо за участие.)
@user-yd2tl1pl1k
@user-yd2tl1pl1k 5 жыл бұрын
@@PyScientist Спасибо вам за то что вы делаете.
@user-eq1nk6nm6q
@user-eq1nk6nm6q 4 жыл бұрын
Да, но когда я подключил статус бар к своей программе, моя прога просто зависла из за time.sleep по этому лучше пользоваться много поточность!
@PyScientist
@PyScientist 4 жыл бұрын
Николай имел ввиду, что вместе с многопоточностью нужно использовать вместо time.sleep, QThread.msleep. Что потокобезопасно.
@user-yd2tl1pl1k
@user-yd2tl1pl1k 4 жыл бұрын
@@PyScientist вы правильно меня поняли, именно вместе с многопоточностью.
@user-qz9dk1uj2k
@user-qz9dk1uj2k 4 жыл бұрын
Можно поинтересоваться сколько у вас опыта программирования на Python, Сергей. И какие книги вы бы порекомендовали по для новичков. И спасибо за качественный контент 👍🥇
@PyScientist
@PyScientist 4 жыл бұрын
Начал писать на python с 12 го года, как таковые книги, то мне оч. нравится Practical programming an introduction to computer science using python 3, Paul Gries, 2013. Second edition. Но это только на английском. Ещё хорошая learn python 3 the hard way. Все конечно зависит от того, для чего будете программировать.
@user-qz9dk1uj2k
@user-qz9dk1uj2k 4 жыл бұрын
@@PyScientist Спасибо за ответ. А программировать для себя и в идиале для дальнейшего труда устройства. А когда следующие видео, планах?
@PyScientist
@PyScientist 4 жыл бұрын
Если для себя, то "hard way" Вам подойдёт там детали как делать правильно. Следующее видео думаю будет недели через две, последний месяц два не выпускал ничего, работа ремонт и ещё кое-что не оставляет шансов на свободное время и любимое дело. Но это временно). Надо еще-бы страничку обновить. Но это уже если совсем свободно станет. Вот закончу с ремонтом тогда развернуть. Думаю на новогодних.
@user-qz9dk1uj2k
@user-qz9dk1uj2k 4 жыл бұрын
@@PyScientist Хорошо, тогда ждём от вас видеороликов под новый год 😉
@ykraunskiu_bespilotnuk
@ykraunskiu_bespilotnuk Жыл бұрын
Спасибо
@crashtv9274
@crashtv9274 4 жыл бұрын
Почему не на сигналах? Если по такой же схеме редактировать text edit много раз вылетит ошибка. На стаке пишут, что такой вариант неправильный
@PyScientist
@PyScientist 4 жыл бұрын
Не совсем понял, что значит на сигналах?
@PyScientist
@PyScientist 4 жыл бұрын
Да действительно он не безопасен может ошибка вылететь.
@fedorivanov8420
@fedorivanov8420 4 жыл бұрын
Как поймать сигнал от объекта из треда? Запустил я, предположим, соединение с сетью в отдельном потоке, а оно выполняется 10 секунд. Как мне поймать сиглан, который испустило соединение по факту установки? Соединение - это QTcpSocket.
@PyScientist
@PyScientist 4 жыл бұрын
Попробуйте почитать про функцию QTcpSocket.waitForConnected() вместо использования сигналов. Или у вас ситуация где это принципиально нужно через сигналы?
@fedorivanov8420
@fedorivanov8420 4 жыл бұрын
@@PyScientist проблема в этом и заключается - waitForConnected замораживает мне окно) При этом если не вызывать этот метод - отправка данных в сокет делается раньше, чем соединение установлено и естественно падает с ошибкой.
@T4gr0id
@T4gr0id 3 жыл бұрын
У меня после запуска данного скрипта в консоли спамится вот такая строка "QObject::setParent::Cannot set parent, new parent is in a different thread" и "QBackingStore::endPaint() called with active painter on backinstore paint device", а потом произходит вылет интерфейса и перезагрузка ядра. В чем трабла?
@PyScientist
@PyScientist 3 жыл бұрын
Там способ не совсем корректный показан, см. комментарии выше. Он применим, но бывает вылетает.
@T4gr0id
@T4gr0id 3 жыл бұрын
@@PyScientist а в след.видео корректный? Мне очень нужно, ваши видео очень понятные.
@PyScientist
@PyScientist 3 жыл бұрын
По потокам у меня только это.( Не собрался продолжить(
@T4gr0id
@T4gr0id 3 жыл бұрын
@@PyScientist А если попробовать таким способом? Создать новый класс, который наследован от QObject , написать метод run, который будет выполнять какой-то код, и передать инстанс этого класса в другой поток с помощью метода moveToThread
@user-zr5gn5kj9p
@user-zr5gn5kj9p 3 жыл бұрын
Темная тема лучше, я в своем пичарме давно так настроил. )
@PyScientist
@PyScientist 3 жыл бұрын
Да я тоже ее прочувствовал, особенно вечером! Или ночером)
@user-fr5mg7vl8e
@user-fr5mg7vl8e 4 жыл бұрын
На 1:00 в определении написано "Многопооточность"
@devZu9
@devZu9 3 жыл бұрын
Здравствуйте, простите, а где видео 17.2 ? А то я вижу, что текущее видео сделано 1.5 года назад. Думал уже есть #17.2 (тем более вы его как бы презентуете в конце), а на канале я его не нашёл.
@PyScientist
@PyScientist 3 жыл бұрын
Как-то другим отвлекся руки не дошли, нужно для порядка продолжить. Попробую собраться с силами)
@e_starkov
@e_starkov 4 жыл бұрын
Пожалуйста, скиньте код) то в точности тоже самое написал и ошибки выдаёт из-за mainwindow
@PyScientist
@PyScientist 4 жыл бұрын
Евгений, добрый вечер листинг кода в первом комментарии к видео.
@potatoboss7778
@potatoboss7778 4 жыл бұрын
@@PyScientist все глаза поломал, но не увидел
@PyScientist
@PyScientist 4 жыл бұрын
@@potatoboss7778 Самый первый коммент 9 месяцев назад
@bill8126
@bill8126 5 ай бұрын
Из дочернего треда не дает изменять ГУИ объекты, пишет ошибку "QObject: Cannot create children for a parent that is in a different thread."
@PyScientist
@PyScientist 5 ай бұрын
Можно через сигналы сделать. Это самый правильный вариант. То есть тригерить сигнал в потоке (есть для кастомизации сигналов свой класс, он немного отличается в pyqt4,5,6) обрабатывать сигнал и не будет таких ошибок
@bill8126
@bill8126 5 ай бұрын
@ntist да, первоначально я так и планировал, пока не наткнулся на это видео. Все таки работать сразу с объектом из нужного потока намного проще и удобнее. Но похоже придется через сигналы. Просто не пойму, почему у вас работает, а у меня выдает ошибку.
@Yanterr
@Yanterr 4 жыл бұрын
Может кто подсказать как сделать нормальное отображение при цикле?
@PyScientist
@PyScientist 4 жыл бұрын
Как понять в цикле?
@Yanterr
@Yanterr 4 жыл бұрын
Мне нужно ,что бы лэйбл грубо говоря менялся на 1 каждую секунду ,но вот при QT ,окно зависает .
@PuzuBlin4ik
@PuzuBlin4ik Жыл бұрын
ты сделал гифку а не прогресс бар, прогресс чего ты замерял??? там реализация намного сложнее
@shaggymuffson9977
@shaggymuffson9977 Жыл бұрын
Почему такие видео бесплатные, а всякие "не до курсы" продаются за деньги?
@PyScientist
@PyScientist 5 жыл бұрын
import sys, time from PyQt5.QtWidgets import QApplication, QDialog, QPushButton, QProgressBar, QTextEdit, QVBoxLayout from PyQt5.QtCore import Qt from PyQt5.QtCore import QThread class ProgressBarThresd(QThread): def __init__(self, mainwindow, parent=None): super().__init__() self.mainwindow = mainwindow def run(self): value = 0 while value < 100: value = value+1 self.mainwindow.progressbar.setValue(value) time.sleep(0.2) class MyProgressbarWindow(QDialog): def __init__(self, parent=None): super().__init__() self.progressbar = QProgressBar() self.progressbar.setAlignment(Qt.AlignCenter) self.PushButtonLaunchLoading = QPushButton('Launch Loading') self.TextEditer = QTextEdit() self.setGeometry(300, 400, 300, 150) vbox = QVBoxLayout() vbox.addWidget(self.PushButtonLaunchLoading) vbox.addWidget(self.TextEditer) vbox.addWidget(self.progressbar) self.setLayout(vbox) self.PushButtonLaunchLoading.clicked.connect(self.launch_progress_bar_filling) self.ProgresbarThread_instance = ProgressBarThresd(mainwindow=self) def launch_progress_bar_filling(self): self.ProgresbarThread_instance.start() app = QApplication(sys.argv) main = MyProgressbarWindow() main.show() sys.exit(app.exec_())
@PyScientist
@PyScientist 4 жыл бұрын
@@SRFxVideos до конца должен доходить, но на счёт нестабильности то да там есть небезопасное перенесение в другой объект. Это небезопасно, см другие комментарии. Оставил это видео так как сам принцип правильный, а вот пример не совсем удачный.
@user-sx3mp5sv2y
@user-sx3mp5sv2y 3 жыл бұрын
Что с окнами в пайчарме? Они как то все по другому расположены. Видео было мне полезно. Благодарю автора
@PyScientist
@PyScientist 3 жыл бұрын
Что подрузамеваете под не так располженны? может версия сильно вперёд ушла, там ещё 2017 в видео 2020.3 который сейчас отличается. Но функционал тот же почти.
@user-sx3mp5sv2y
@user-sx3mp5sv2y 3 жыл бұрын
@@PyScientist ну консоль сверху, с панелькой project что-то не так хз
@PyScientist
@PyScientist 3 жыл бұрын
Ну так они плавающие, в любое место можно запихнуть
@user-sx3mp5sv2y
@user-sx3mp5sv2y 3 жыл бұрын
@@PyScientist я понимаю. Это не претензия) Интересно, что вам так удобнее. Это необычно
@PyScientist
@PyScientist 3 жыл бұрын
Простая привычка))
@user-gw5bb4hn4u
@user-gw5bb4hn4u Жыл бұрын
Вместо наследования лучше взять Слот и сигнал, так как при большом объеме информации приложение падает
@PyScientist
@PyScientist Жыл бұрын
Да, все верно. Когда писал видео не знал об этом. Потом меня поправляли см. комментарии.
@n3tium
@n3tium 8 ай бұрын
привет. вижу что разбираешься в этом во всем механизме. подскажи какую-нибудь литературу по ооп питона и многопоточность, многозадачность. как вообще правильно строит архитектуру кода
@PyScientist
@PyScientist 8 ай бұрын
@n3tium Привет, конкретно по питону даже затрудняюсь. Вообще по ООП и правильной архитектуре рекомендую clean code Robert C. Martin. там он на примере плюсов рассказывает, но принципы те же. По многозадачности/многопоточности начните с "Python на практике" Марк Саммерфилд.
@n3tium
@n3tium 8 ай бұрын
@@PyScientist спасибо, огромное!
@SergMirny_yt
@SergMirny_yt 4 жыл бұрын
От темной темы глаза меньше устают
@madclips9967
@madclips9967 4 жыл бұрын
self.alue+1
@uninstaller1899
@uninstaller1899 4 жыл бұрын
Почему нельзя сделать так, чтоб было всё понятно? Так и прет: "я такой умный, а вот вы никогда не догадаетесь откуда взялся mainwindow".
@PyScientist
@PyScientist 4 жыл бұрын
Ну только спросить нужно если непонятно, я с радостью отвечу.
@evgenyzev4265
@evgenyzev4265 4 жыл бұрын
Ни черта не видно из-за темного фона!
@PyScientist
@PyScientist 4 жыл бұрын
Да вот я тоже думаю, как то не очень, кому-то нравится, а кому то нет. Вообще темный фон - это ночной режим, что-бы не было излишне ярко и глаза не уставали. Убедили, буду стандартный белый фон делать! Как раньше.
@devZu9
@devZu9 3 жыл бұрын
@@PyScientist ну зачем... лучше ведь стало
@PyScientist
@PyScientist 3 жыл бұрын
Оставил черный фон)
@barkas2589
@barkas2589 2 жыл бұрын
Спасибо
Python and PyQt library, using QtDesigner
39:03
PyScientist
Рет қаралды 52 М.
Я обещал подарить ему самокат!
01:00
Vlad Samokatchik
Рет қаралды 9 МЛН
Comfortable 🤣 #comedy #funny
00:34
Micky Makeover
Рет қаралды 12 МЛН
ПОМОГЛА НАЗЫВАЕТСЯ😂
00:20
Chapitosiki
Рет қаралды 4,2 МЛН
Потоки в Python за 5 минут
7:05
Pitonist
Рет қаралды 23 М.
Implementing a background process in PyQt5 using QThread
15:08
Mike Miller
Рет қаралды 38 М.
Проектируем соцсеть (задача с собеса)
19:44
Простой код
Рет қаралды 1,8 М.
Python с нуля. Урок 3 | Функции
14:44
Иван Викторович
Рет қаралды 794 М.