Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937

Работает ли у вас этот пример?

13.05.2022, 17:08. Показов 940. Ответов 8

Студворк — интернет-сервис помощи студентам
Добрый день! Посмотрите, пожалуйста, работает ли у вас этот пример (скопировал со статьи тут)


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
65
import time
 
from PyQt5.QtCore import pyqtSlot, QThreadPool, QTimer
from PyQt5.QtWidgets import (
    QLabel,
    QWidget,
    QMainWindow,
    QPushButton,
    QVBoxLayout,
    QApplication,
)
 
 
class MainWindow(QMainWindow):
 
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
 
        self.setFixedSize(250, 100)
        self.setWindowTitle("Sheep Picker")
 
        self.sheep_number = 1
        self.timer = QTimer()
        self.picked_sheep_label = QLabel()
        self.counted_sheep_label = QLabel()
 
        self.layout = QVBoxLayout()
        self.main_widget = QWidget()
        self.thread_manager = QThreadPool()
        self.pick_sheep_button = QPushButton("Pick a sheep!")
 
        self.layout.addWidget(self.counted_sheep_label)
        self.layout.addWidget(self.pick_sheep_button)
        self.layout.addWidget(self.picked_sheep_label)
 
        self.main_widget.setLayout(self.layout)
        self.setCentralWidget(self.main_widget)
 
        self.timer.timeout.connect(self.count_sheep)
        self.pick_sheep_button.pressed.connect(self.pick_sheep_safely)
 
        self.timer.start()
 
    @pyqtSlot()
    def count_sheep(self):
        self.sheep_number += 1
        self.counted_sheep_label.setText(f"Counted {self.sheep_number} sheep.")
 
    @pyqtSlot()
    def pick_sheep(self):
        self.picked_sheep_label.setText(f"Sheep {self.sheep_number} picked!")
        time.sleep(5)  # This function doesn't affect GUI responsiveness anymore...
 
    @pyqtSlot()
    def pick_sheep_safely(self):
        self.thread_manager.start(self.pick_sheep)  # ...since .start() is used!
 
 
if __name__ == "__main__":
    app = QApplication([])
 
    main_window = MainWindow()
    main_window.show()
 
    app.exec()
Добавлено через 1 час 25 минут
статья, верхняя ссылка не та
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.05.2022, 17:08
Ответы с готовыми решениями:

Работает ли у вас этот код ?
procedure TForm1.Button1Click(Sender: TObject); var mas:array of String; a,b,m:integer; begin for a := 1 to 25 do ...

Работатет ли у вас этот код на PyQT5
Добрый день! Работает ли у вас этот код? Собственно интересует эта часть: self.img = QPixmap('image.jpg') ...

У Вас нет разрешений на этот доступ, обратитесь к системному администратору
Настолный компьютер с операционкой Win 7 максимальная x64 подключен в интернет через роутер ASUS RT-N66U по проводу; и ноутбук с...

8
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
13.05.2022, 17:10
Работает, поголовье растёт
Нажатие на кнопку влияния на рост поголовья не оказывает, а на консоль валит:
Code
1
2
3
4
5
6
7
user@linux:~> python3 mihalych.py
QSettings::value: Empty key passed
QSettings::value: Empty key passed
Traceback (most recent call last):               <=== после нажатия на кнопку
  File "mihalych.py", line 56, in pick_sheep_safely
    self.thread_manager.start(self.pick_sheep)  # ...since .start() is used!
TypeError: QThreadPool.start(QRunnable, int priority=0): argument 1 has unexpected type 'method'
1
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937
13.05.2022, 19:25  [ТС]
Цитата Сообщение от iamvic Посмотреть сообщение
Работает, поголовье растёт
И у меня растет но в консоле тоже TypeError.

Добавлено через 24 минуты
Видимо версии python и pyqt не подходят, либо разрядность самого python влияет (у меня 32-х стоит). Поставил 64-х и pyside6, попробовал тот же пример, все работает нормально

Если у кого-то без ошибок запустится pyqt5, напишите, пожалуйста версии python и pyqt
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
16.05.2022, 07:57
Михалыч, код какой то мягко говоря дурацкий, QThreadPool принимает объекты QRunnable, а ты метод передаешь.

Добавлено через 1 минуту
Тем более sleep в потоке использовать, тоже извращение какое то.

Добавлено через 1 минуту
P.S. Возможно в 6 работает просто по случайности.

Добавлено через 8 минут
UPD:

Ошибся, глядим в исходник PySide2(PyQt5):
Python
1
2
3
class QThreadPool(PySide2.QtCore.QObject):
    ...
    def start(self, runnable:PySide2.QtCore.QRunnable, priority:int=...) -> None: ...
Глядим в исходник PySide6(PyQt6):
Python
1
2
3
4
5
6
class QThreadPool(PySide6.QtCore.QObject):
    ...
    @overload
    def start(self, arg__1:Callable, priority:int=...) -> None: ...
    @overload
    def start(self, runnable:PySide6.QtCore.QRunnable, priority:int=...) -> None: ...
1
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937
16.05.2022, 09:30  [ТС]
Цитата Сообщение от Fudthhh Посмотреть сообщение
код какой то мягко говоря дурацкий
Не виноватая я, он сам пришел В смысле из книжки взял... Видимо не все книги хороши.
Спасибо, буду более критично относится к тексту.

Добавлено через 4 минуты
Цитата Сообщение от Fudthhh Посмотреть сообщение
Тем более sleep в потоке использовать, тоже извращение какое то.
А что там использовать? Надо же деятельность какую-то в потоке показать (пример-то учебный ), что бы понять что он действительно потоками работает. Если у вас есть какой-нибудь минимально воспроизводимый пример, огромная просьба поделиться
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
16.05.2022, 11:28
Михалыч, я не глядел статью, до этого момента, там три примера, для PySide6, PyQt6 и PyQt5, в самом начале статьи написано что все это для Qt 6.2.0

Добавлено через 41 секунду
Вообще для этой задачи я не понимаю зачем использовать потоки, тут и сигналов за глаза хватает.

Добавлено через 8 минут
По факту это вроде как удобная обертка для выполнения в потоке, каких то тяжелых функций с унаследованием данных класса (я не пользовался сам этим), раньше все тяжелые расчеты закидывались в QThread.run и к сигналу цепляли уже изменения gui в самом классе.
1
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937
16.05.2022, 11:39  [ТС]
Цитата Сообщение от Fudthhh Посмотреть сообщение
Вообще для этой задачи я не понимаю зачем использовать потоки, тут и сигналов за глаза хватает.
Конкретно для этой задачи, я согласен =)

Цитата Сообщение от Fudthhh Посмотреть сообщение
обертка для выполнения в потоке, каких то тяжелых функций
Вот я к этому потихоньку иду, есть кое-какие расчеты на 5-10 минут (а мне нужно несколько вариантов посчитать) и сейчас я жду пока один вариант посчитает, потом запускаю другой, а хочется что бы как в сказке, накидал и пусть считает

Добавлено через 3 минуты
Цитата Сообщение от Fudthhh Посмотреть сообщение
раньше все тяжелые расчеты закидывались в QThread.run и к сигналу цепляли уже изменения gui в самом классе
Если у вас есть пример, было бы отлично) Если нет все равно спасибо! Пойду мучить гугл
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
16.05.2022, 13:27
Лучший ответ Сообщение было отмечено Михалыч как решение

Решение

Михалыч, так себе пример, на коленке писал:

Пример 1:
Кликните здесь для просмотра всего текста

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
import sys
from PySide2 import QtWidgets, QtCore
 
 
class Worker(QtCore.QThread):
    ticked: QtCore.SignalInstance = QtCore.Signal(int)
 
    def __init__(self, delay: int, parent: QtCore.QObject = None) -> None:
        QtCore.QThread.__init__(self, parent)
        self.delay = delay
    
    def run(self) -> None:
        for second in range(self.delay):
            self.ticked.emit(second)
            self.sleep(1)
 
 
class Example(QtWidgets.QWidget):
 
    def __init__(self, parent: QtWidgets.QWidget = None) -> None:
        QtWidgets.QWidget.__init__(self, parent)
 
        self.spinBox = QtWidgets.QSpinBox(self)
        
        self.pushButton = QtWidgets.QPushButton("Start", self)
        self.pushButton.clicked.connect(self.pushButtonClicked)
 
        layout = QtWidgets.QFormLayout(self)
        layout.addRow("Delay:", self.spinBox)
        layout.addRow(self.pushButton)
 
    def pushButtonClicked(self) -> None:
        delay = self.spinBox.value()
        worker = Worker(delay, self)
        worker.started.connect(self.workerStarted)
        worker.ticked.connect(self.workerTicked)
        worker.finished.connect(self.workerFinished)
        worker.start()
 
    def workerStarted(self) -> None:
        worker: Worker = self.sender()
        print(f"Worker(delay={worker.delay}) start")
 
    def workerTicked(self, second: int) -> None:
        worker: Worker = self.sender()
        print(f"Worker(delay={worker.delay}) tick {second}")
 
    def workerFinished(self) -> None:
        worker: Worker = self.sender()
        print(f"Worker(delay={worker.delay}) finish")
 
 
app = QtWidgets.QApplication(sys.argv)
main = Example()
main.show()
sys.exit(app.exec_())


Пример 2:
Кликните здесь для просмотра всего текста

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
65
66
67
68
69
70
71
72
73
74
75
76
import sys
from PySide2 import QtWidgets, QtCore
 
 
class Worker(QtCore.QThread):
    delay: int = 0
    ticked: QtCore.SignalInstance = QtCore.Signal(int)
 
    def __init__(self, parent: QtCore.QObject = None) -> None:
        QtCore.QThread.__init__(self, parent)
    
    def run(self) -> None:
        for second in range(self.delay):
            self.ticked.emit(second)
            self.sleep(1)
 
 
class ProgressBar(QtWidgets.QWidget):
 
    def __init__(self, parent: QtWidgets.QWidget = None) -> None:
        QtWidgets.QWidget.__init__(self, parent)
        
        self.spinBox = QtWidgets.QSpinBox(self)
        self.spinBox.setMinimumWidth(50)
        self.spinBox.setSuffix(" с")
 
        self.progressBar = QtWidgets.QProgressBar(self)
        self.progressBar.setValue(0)
        
        self.worker = Worker(self)
        self.worker.started.connect(self.workerStarted)
        self.worker.ticked.connect(self.progressBar.setValue)
        self.worker.finished.connect(self.workerFinished)
        
        self.pushButton = QtWidgets.QPushButton("Start", self)
        self.pushButton.clicked.connect(self.pushButtonClicked)
 
        layout = QtWidgets.QHBoxLayout(self)
        layout.addWidget(self.spinBox)
        layout.addWidget(self.progressBar)
        layout.addWidget(self.pushButton)
 
    def pushButtonClicked(self) -> None:
        delay: int = self.spinBox.value()
        self.progressBar.setMaximum(delay - 1)
        self.worker.delay = delay
        self.worker.start()
    
    def workerStarted(self) -> None:
        self.pushButton.setDisabled(True)
 
    def workerFinished(self) -> None:
        self.pushButton.setEnabled(True)
 
 
class Example(QtWidgets.QWidget):
 
    def __init__(self, parent: QtWidgets.QWidget = None) -> None:
        QtWidgets.QWidget.__init__(self, parent)
 
        self.progressBar1 = ProgressBar(self)
        self.progressBar2 = ProgressBar(self)
        self.progressBar3 = ProgressBar(self)
        self.progressBar4 = ProgressBar(self)
        
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.progressBar1)
        layout.addWidget(self.progressBar2)
        layout.addWidget(self.progressBar3)
        layout.addWidget(self.progressBar4)
 
 
app = QtWidgets.QApplication(sys.argv)
main = Example()
main.show()
sys.exit(app.exec_())
1
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937
16.05.2022, 15:01  [ТС]
Fudthhh, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.05.2022, 15:01
Помогаю со студенческими работами здесь

Этот форум мне столько дал, я вас всех очень люблю...
этот форум мне столько даль я вас всех очень люблю... извините за тему проста не знаю как выразиться по другому...... ...

Решил пример! Прошу Вас проверить. КНФ, ДНФ
Нужна помощь в проверке этого выражения. Если где-то ошибки, то пожалуйста, объясните. Требовалось найти КНФ и ДНФ. Буду очень благодарен.

У вас есть этот документ в целости и сохранности, а то у моего нету 210 страницу и может ещё какой-то
У вас есть этот документ в целости и сохранности, а то у моего нету 210 страницу и может ещё какой-то...

Как решить этот пример
Объясните

как сделать этот пример
Создать текстовый файл, в который записать не менее 20 целых чисел в диапазоне от -10 до 20. Вывести содержимое файла на экран. Записать...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru