С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/55: Рейтинг темы: голосов - 55, средняя оценка - 4.65
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 29
PyQt5

Как избавиться от зависания GUI?

15.04.2018, 03:41. Показов 10538. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Не могу уже вторые сутки разобраться с проблемой. Есть графический интерфейс созданный в qt designer. Работаю через pyqt5. При выполнении цикла while зависает весь gui и нельзя нажать ни по одной кнопке. Дабы не усложнять понимание, накидал минимальный код с циклом while с такой проблемой. Есть txt файл с числами от 0 до 10 в столбик. В окне приложения всего 2 кнопки:
1) Загрузить числа
2) старт.

После загрузки чисел из txt файла они сохраняются в переменную numbers. Потом нажимается кнопка Старт и происходит вызов в отдельном потоке функции numbers, которая выводит рандомное число из загруженного списка чисел (0,10) в консоль каждые 5 сек. Gui сразу же зависает( Поток пробую организовать через модуль threading. Моя задача сделать так, чтобы числа выводились в консоль в цикле while и само окно интерфейса не зависало. Собственно прилагаю сам код, txt файл сможете создать сами с числами от 0 до 10 в столбик.

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
55
56
57
58
59
60
61
62
63
64
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QMainWindow, QTextEdit,
    QAction, QFileDialog, QApplication)
import sys
from random import choice
import threading
import time
 
def numbers(numb): # функция с бесконечным циклом рандомного вывода чисел каждые 5 сек
    while 1 != 0:
        print(choice(numb))
        time.sleep(5)
 
 
 
class Ui_Dialog(object):      # Класс прорисовки окна
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 300)
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(20, 20, 111, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(Dialog)
        self.pushButton_2.setGeometry(QtCore.QRect(20, 70, 111, 23))
        self.pushButton_2.setObjectName("pushButton_2")
 
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
 
    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.pushButton.setText(_translate("Dialog", "загрузить числа"))
        self.pushButton_2.setText(_translate("Dialog", "старт"))
 
class MyWin(QtWidgets.QMainWindow):               # основной класс
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.ui.pushButton.clicked.connect(self.showDialog)     # нажатие на кнопку "загрузить числа" с вызовом метода showDialog
        self.ui.pushButton_2.clicked.connect(self.showDialog2)  # нажатие на кнопку "старт" с вызовом метода showDialog2
 
 
    def showDialog(self):  # метод загрузки чисел из txt файла в переменную numbers в столбик
        try:
            fname = QFileDialog.getOpenFileName(self, 'Open file', '/home')[0]
            f = open(fname, 'r')
            with f:
                self.numbers = f.read().split("\n")  # сама переменная numbers с числами от 0 до 10 которые загрузили из txt
                print(self.numbers)
        except:
            pass
 
    def showDialog2(self):  # метод вызова функции numbers в отдельном потоке с аргументом наших чисел от 0 до 10
        t = threading.Thread(target=numbers(self.numbers))
        t.start()
 
 
if __name__=="__main__":
    app = QtWidgets.QApplication(sys.argv)
    myapp = MyWin()
    myapp.show()
    sys.exit(app.exec_())
Буду очень благодарен если кто то поможет этот код модернизировать и правильно вывести функцию numbers в отдельный поток чтобы она не грузила окно приложения. Мне намного понятней уже на своем коде изучать рабочее решение. Читал про сигналы и слоты но не особо понял как это реализовать. Был небольшой опыт работы с threading по этому выбрал этот путь. Думаю на своем коде быстрее было бы разобраться.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.04.2018, 03:41
Ответы с готовыми решениями:

BackgroundWorker и DataSet: как избавиться от зависания формы?
на стороне wcf организован метод: public DataSet getDS() { DataSet ds = new DataSet(); ...

Как избавиться от зависания окна во время долгих расчетов?
Возможно немного глупый вопрос, но незнаю как по другому описать: существует программа состоящую из главной формы на которой расположены 3...

Графический интерфейс НЕ GUI! как избавиться от глобальных переменных?
Создаю простенький графический интерфейс function = interface( input_args ) global hAxes hFigl hEdl_vertice_X hEdl_vertice_Y...

6
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
15.04.2018, 09:10
Python
1
2
3
def showDialog2(self):  # метод вызова функции numbers в отдельном потоке с аргументом наших чисел от 0 до 10
        t = threading.Thread(target=numbers, args=self.numbers)
        t.start()
1
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 29
15.04.2018, 12:20  [ТС]
Спасибо, проблема оказалась в малом. Так же нужно немного было изменить функцию Numbers вот так:
Python
1
2
3
4
def numbers(*args): 
    while 1 != 0:
        print(choice(args))
        time.sleep(5)
Правда не понимаю почему не работал мой код, ведь аргументы передавались как ни странно в функцию и в консоли отображались числа даже с моим кривым вариантом кода. Но самое главное что работает
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
15.04.2018, 12:39
Цитата Сообщение от malchik_And Посмотреть сообщение
Правда не понимаю почему не работал мой код, ведь аргументы передавались как ни странно в функцию и в консоли отображались числа
Вот это numbers(self.numbers) вызов функции, начинал работу бесконечный цикл
Python
1
2
3
while 1 != 0:
        print(choice(numb))
        time.sleep(5)
и дальше ничего не выполнялось и thread не запуcкался
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.04.2018, 13:17
Стоит использовать QThread и сигналы слоты.
(Есть так же QtConcurrent)
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,763
15.04.2018, 20:45
а зачем тут вообще лишний поток? для такой функции QTimer вполне хватит
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from PyQt5 import Qt
 
class W(Qt.QLabel):
    def __init__(self):
        Qt.QLabel.__init__(self)
        self.tmr = Qt.QTimer()
        self.tmr.timeout.connect(self.on_timer)
        self.count = 0
    def on_timer(self):
        self.setText(str(self.count))
        self.count += 1
 
if __name__=="__main__":
    app = Qt.QApplication([])
    w = W()
    w.tmr.start(1000)
    w.resize(100,50)
    w.show()
    app.exec_()
1
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
18.04.2018, 14:48
С потоком, конечно, правильнее, но если очень лень, можно http://doc.qt.io/qt-5/qcoreapp... cessEvents .
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.04.2018, 14:48
Помогаю со студенческими работами здесь

Избавиться от зависания программы при расчетах
Здравствуйте! Столкнулся с такой проблемкой, программа не желает считать, при запуске происходит зависание программы. Просматривал...

Как запустить qt gui программу, как демон, без gui, скрыв gui?
Как запустить qt gui программу, как демон, без gui, скрыв gui? В gui браузер выполняет определенные действия, и нужно запустить этот...

[ubuntu] Как запустить qt-gui программу без gui-интерфейся из консоли?
Как запустить qt-gui программу без gui-интерфейса из консоли?

Как нарисовать в gui из подгружаемой функции или передать точки в gui
Добрый день! Помогите разобраться, пожалуйста. Есть gui, где я рисую всякие графики такой штукой(например): ...

Как запустить GUI приложение (например, notepad.exe) без отображения GUI?
Добрый день. Интересует есть ли такая возможность, как запустить GUI приложение (например, notepad.exe) без отображения GUI?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru