Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
manibashkas
1 / 1 / 1
Регистрация: 06.02.2018
Сообщений: 5
1

Pyqt5 потоки

06.02.2018, 19:09. Просмотров 776. Ответов 5
Метки нет (Все метки)

Здравствуйте, пишу программу для винды. Собственно ничего особенного, кликает по заранее заданным координатам и выполняет ряд функций. Интерфейс написан с использованием pyqt5. Вопрос в следующем. Гуи зависает, потому что основной функционал не отправлен в отдельный поток. В этом и вопрос..Как организовать потоки в pyqt5 ? прочёл не мало форумов и примеров. не понятно. Если есть, кто-то, кто может доходчиво объяснить, буду очень признателен. Часть кода прилагается..

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Clicker(QMainWindow):
    # click objects 
    objects_list = ['Start', 'OptimizResult','ScreenShot','Drawdown','ProfitResult',
                    'OnTesterResult','UnderArrow','Arrow','BestResult','SetParams',
                    'SwitchModel','Report','ReportRightClick','SaveReportAs',
                    'FileName','SaveFile','CloseHTML','Settings', 'OptimizedSymbol',
                    'OptimizationMark']  
    # cpu parameters entry
    check_cpu_dict = {'ProcName': '', 'CheckCPUTimer': '', 'ProcPerc': '', 'CollectingTimer': '', 'Optimizations_qty': ''}    
    # glabal vars
    objects_dict = {} # create dict in the kind: Object: {X-coord: , Y-coord: }
    symbols = [] # enetred symbols
    optimization_type = '' # optimization model
    test_type = '' # test model
    
    def __init__(self):
        super(Clicker,self).__init__()
        loadUi('C:/Users/%username%/Anaconda3/Lib/site-packages/pyqt5-tools/designer_test/clicker.ui',self)
        self.setWindowTitle('AI')
        self.StartAI.clicked.connect(self.start_ai_clicked)
        self.Save_params.clicked.connect(self.save_button_clicked)
        self.Load_params.clicked.connect(self.load_button_clicked)
        self.objects_dict = {name:{'X': '', 'Y': ''} for name in self.objects_list}
    @pyqtSlot()
    def start_ai_clicked(self):
        self.get_entered_data()
        ai = AI(coordinates=self.objects_dict, cpu_parameters=self.check_cpu_dict,optimization_type=self.optimization_type,
                test_type= self.test_type,symbols = self.symbols)
        
        ai.start()
 
if __name__ == '__main__':
    app = QtCore.QCoreApplication.instance()
    if app is None:
        app = QApplication(sys.argv)
    ex = Clicker()
    ex.show()
    app.exec_()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2018, 19:09
Ответы с готовыми решениями:

Python и Pyqt5: потоки
Добрый день, программисты. Я начинающий программист. У меня есть такая задача:...

многопоточность PyQt5
Помогите, пожалуйста, разобраться. В Python я совсем новичок. В скрипте...

Установка PyQt5
Не могу установить PyQt5. Скачал с официального сайта и запустил файл...

Не работает PyQt5
Долго пытался найти решение данной проблемы, ничего не выходило. Когда я из...

PyQt5 python 3.4.1
Приветствую всех и прошу помощи! нужна программа в которой 4 строчки куда...

5
alex925
2673 / 2280 / 630
Регистрация: 19.03.2012
Сообщений: 8,830
06.02.2018, 21:55 2
manibashkas, не знаю, что тебе не понятно, ну вот ещё 1 пример по работе с потоками. Все, что тебе нужно изучить касательно работы с потоками в pyqt это работа с сигналами и слотами, все.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
"""
Пример передачи в сигнале различных типов данных
"""
import sys
import time
import threading
 
from PyQt5 import QtWidgets, QtCore
 
 
def thread(my_func):
    """
    Запускает функцию в отдельном потоке
    """
    def wrapper(*args, **kwargs):
        my_thread = threading.Thread(target=my_func, args=args, kwargs=kwargs)
        my_thread.start()
    return wrapper
 
@thread
def processing(signal):
    """
    Эмулирует обработку (скачивание) каких-то данных
    """
    res = [i for i in 'hello']
    time.sleep(5)
    signal.emit(res)  # Посылаем сигнал в котором передаём полученные данные
 
 
class MyWidget(QtWidgets.QWidget):
    my_signal = QtCore.pyqtSignal(list, name='my_signal')
 
    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)
        self.mainLayout = QtWidgets.QHBoxLayout()
        self.setLayout(self.mainLayout)
 
        self.button = QtWidgets.QPushButton("Emit your signal!", self)
        self.mainLayout.addWidget(self.button)
 
        # При нажатии на кнопку запускаем обработку данных
        self.button.clicked.connect(lambda: processing(self.my_signal))
 
        # Обработчик сигнала
        self.my_signal.connect(self.mySignalHandler, QtCore.Qt.QueuedConnection)
 
    def mySignalHandler(self, data):  # Вызывается для обработки сигнала
        print(data)
 
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MyWidget()
    window.show()
    app.exec_()
0
manibashkas
1 / 1 / 1
Регистрация: 06.02.2018
Сообщений: 5
07.02.2018, 10:50  [ТС] 3
Большое спасибо! всё работает, не думаю, конечно, что я до конца осознал как, магия. но направление я понял. спасибо ещё раз
0
alex925
2673 / 2280 / 630
Регистрация: 19.03.2012
Сообщений: 8,830
07.02.2018, 11:11 4
manibashkas, говори, что контактно на понятно, поясню.
0
manibashkas
1 / 1 / 1
Регистрация: 06.02.2018
Сообщений: 5
07.02.2018, 15:24  [ТС] 5
поток останавливается, когда полностью отработает? т.е., к примеру, запускаем приложение, в отдельном потоке в этом приложении запускается бесконечный цикл. мы закрываем ГУИ, т.е. завершаем этот процесс. а поток продолжает работу? Честно говоря, я думал, что потоки существуют в самом процессе и с его завершением прекращают работу. и ещё, в приведённом примере, "# При нажатии на кнопку запускаем обработку данных",
Python
1
my_signal = QtCore.pyqtSignal(list, name='my_signal')
что это за сигнал? Простите за невежественность заранее.
0
alex925
2673 / 2280 / 630
Регистрация: 19.03.2012
Сообщений: 8,830
07.02.2018, 22:29 6
Цитата Сообщение от manibashkas Посмотреть сообщение
my_signal = QtCore.pyqtSignal(list, name='my_signal')
Это создание своего собственного сигнала, через который можно предавать списки.
0
07.02.2018, 22:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2018, 22:29

Не работает PyQt5
Здравствуйте. Недавно обновлял python - удалил все, что связано с python и...

Книги по PyQt5 и Qt
Посоветуйте книги по PyQt5 и Qt или какие-то уроки так хочу освоить...

Не подключается PyQt5
Доброго времени суток. Что сделать с этой ошибкой? Попробовал установить модуль...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru