Как увеличить QLCDNumber в Python

Я пытаюсь обновить значение QLCDNumber. То, что я хочу сделать, - это запустить функцию в отдельном потоке, которая выводит значение (в данном случае просто счетчик вверх) и отображает это значение на экране.

Вот сценарий Python, который я использую, а ниже - содержимое файла.ui (где QLCDNumber называется "disp"):

import sys
import threading
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import uic
from time import sleep


Ui_MainWindow, QtBaseClass = uic.loadUiType("./disp.ui")

class MainWindow(QMainWindow, Ui_MainWindow):
    counter = pyqtSignal(int)
    counting = False

    def __init__(self):
        QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)

        self.disp.display(?????) #<---- 


    def startCounting(self):
        if not self.counting:
            self.counting = True
            thread = threading.Thread(target=self.something)
            thread.start()

    def something(self):
        for i in range(100):
            self.counter.emit(int(i))
            sleep(0.5)
        self.counting = False


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

.ui файл:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>577</width>
    <height>504</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="QLCDNumber" name="disp"/>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>577</width>
     <height>24</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

1 ответ

Решение

Вы почти на месте, вы излучаете сигнал с новым значением, однако ваш сигнал не связан ни с какой функцией, вам просто нужно создать функцию для обновления значения QLCDNumber и подключить свой счетчик сигналов к этой функции:

import sys
import threading

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import uic

from time import sleep


Ui_MainWindow, QtBaseClass = uic.loadUiType("./disp.ui")

class MainWindow(QMainWindow, Ui_MainWindow):
    counter = pyqtSignal(int)
    counting = False

    def __init__(self):
        QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)

        self.counter.connect(self.update_lcd)
        # self.startCounting()

    def update_lcd(self, value):
        self.disp.display(value)

    def startCounting(self):
        if not self.counting:
            self.counting = True
            thread = threading.Thread(target=self.something)
            thread.start()

    def something(self):
        for i in range(100):
            self.counter.emit(int(i))
            sleep(0.5)
        self.counting = False


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

Я бы предложил использовать QThread или QRunnable вместо потокового модуля для запуска фоновой задачи. Хорошее объяснение различий можно найти здесь.

Другие вопросы по тегам