Динамическое изменение текста в QLabel

Рейтинг: 1Ответов: 2Опубликовано: 31.01.2023

Написан код, который стягивает информацию через json. Код работает.
Что нужно стягивать тянет, что нужно считать считает.

Создан интерфейс приложения через QT Designer. В нем расположил Labels условно 1, 2, 3, ... . Необходимо после стягивания информации через json размещать её в соответствующие Labels.

Просмотрел видео уроки пробовал разные варианты, но безуспешно.

Подозреваю, что есть структурное непонимание проблемы.

interface.py:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setMinimumSize(QtCore.QSize(800, 600))
        MainWindow.setMaximumSize(QtCore.QSize(800, 600))
        MainWindow.setMouseTracking(False)
        MainWindow.setAutoFillBackground(False)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
        self.centralwidget.setSizePolicy(sizePolicy)
        self.centralwidget.setObjectName("centralwidget")
        self.simple_asteroid = QtWidgets.QLabel(self.centralwidget)
        self.simple_asteroid.setGeometry(QtCore.QRect(10, 10, 300, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.simple_asteroid.setFont(font)
        self.simple_asteroid.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.simple_asteroid.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.simple_asteroid.setObjectName("simple_asteroid")
        self.simple_asteroid_base_price = QtWidgets.QLabel(self.centralwidget)
        self.simple_asteroid_base_price.setGeometry(QtCore.QRect(320, 10, 100, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.simple_asteroid_base_price.setFont(font)
        self.simple_asteroid_base_price.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.simple_asteroid_base_price.setObjectName("simple_asteroid_base_price")
        self.variegated_asteroid = QtWidgets.QLabel(self.centralwidget)
        self.variegated_asteroid.setGeometry(QtCore.QRect(10, 30, 300, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.variegated_asteroid.setFont(font)
        self.variegated_asteroid.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.variegated_asteroid.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.variegated_asteroid.setObjectName("variegated_asteroid")
        self.complex_asteroid = QtWidgets.QLabel(self.centralwidget)
        self.complex_asteroid.setGeometry(QtCore.QRect(10, 50, 300, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.complex_asteroid.setFont(font)
        self.complex_asteroid.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.complex_asteroid.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.complex_asteroid.setObjectName("complex_asteroid")
        self.mercoxit_asteroid = QtWidgets.QLabel(self.centralwidget)
        self.mercoxit_asteroid.setGeometry(QtCore.QRect(10, 70, 300, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.mercoxit_asteroid.setFont(font)
        self.mercoxit_asteroid.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.mercoxit_asteroid.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.mercoxit_asteroid.setObjectName("mercoxit_asteroid")
        self.ubiquitous_moon = QtWidgets.QLabel(self.centralwidget)
        self.ubiquitous_moon.setGeometry(QtCore.QRect(10, 90, 300, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.ubiquitous_moon.setFont(font)
        self.ubiquitous_moon.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.ubiquitous_moon.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.ubiquitous_moon.setObjectName("ubiquitous_moon")
        self.rare_moon = QtWidgets.QLabel(self.centralwidget)
        self.rare_moon.setGeometry(QtCore.QRect(10, 110, 300, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.rare_moon.setFont(font)
        self.rare_moon.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.rare_moon.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.rare_moon.setObjectName("rare_moon")
        self.variegated_asteroid_base_price = QtWidgets.QLabel(self.centralwidget)
        self.variegated_asteroid_base_price.setGeometry(QtCore.QRect(320, 30, 100, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.variegated_asteroid_base_price.setFont(font)
        self.variegated_asteroid_base_price.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.variegated_asteroid_base_price.setObjectName("variegated_asteroid_base_price")
        self.complex_asteroid_base_price = QtWidgets.QLabel(self.centralwidget)
        self.complex_asteroid_base_price.setGeometry(QtCore.QRect(320, 50, 100, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.complex_asteroid_base_price.setFont(font)
        self.complex_asteroid_base_price.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.complex_asteroid_base_price.setObjectName("complex_asteroid_base_price")
        self.mercoxit_asteroid_base_price = QtWidgets.QLabel(self.centralwidget)
        self.mercoxit_asteroid_base_price.setGeometry(QtCore.QRect(320, 70, 100, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.mercoxit_asteroid_base_price.setFont(font)
        self.mercoxit_asteroid_base_price.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.mercoxit_asteroid_base_price.setObjectName("mercoxit_asteroid_base_price")
        self.ubiquitous_moon_base_price = QtWidgets.QLabel(self.centralwidget)
        self.ubiquitous_moon_base_price.setGeometry(QtCore.QRect(320, 90, 100, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.ubiquitous_moon_base_price.setFont(font)
        self.ubiquitous_moon_base_price.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.ubiquitous_moon_base_price.setObjectName("ubiquitous_moon_base_price")
        self.rare_moon_base_price = QtWidgets.QLabel(self.centralwidget)
        self.rare_moon_base_price.setGeometry(QtCore.QRect(320, 110, 100, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.rare_moon_base_price.setFont(font)
        self.rare_moon_base_price.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.rare_moon_base_price.setObjectName("rare_moon_base_price")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.simple_asteroid.setText(_translate("MainWindow", "Simple Asteroid Mining Cryslal Type B II"))
        self.simple_asteroid_base_price.setText(_translate("MainWindow", "0"))
        self.variegated_asteroid.setText(_translate("MainWindow", "Variegated Asteroid Mining Crystal Type B II"))
        self.complex_asteroid.setText(_translate("MainWindow", "Complex Asteroid Mining Crystal Type B II"))
        self.mercoxit_asteroid.setText(_translate("MainWindow", "Mercoxit Asteroid Mining Crystal Type B II"))
        self.ubiquitous_moon.setText(_translate("MainWindow", "Ubiquitous Moon Mining Crystal Type B II"))
        self.rare_moon.setText(_translate("MainWindow", "Rare Moon Mining Crystal Type B II"))
        self.variegated_asteroid_base_price.setText(_translate("MainWindow", "0"))
        self.complex_asteroid_base_price.setText(_translate("MainWindow", "0"))
        self.mercoxit_asteroid_base_price.setText(_translate("MainWindow", "0"))
        self.ubiquitous_moon_base_price.setText(_translate("MainWindow", "0"))
        self.rare_moon_base_price.setText(_translate("MainWindow", "0"))

main.py:

import sys
from PyQt5 import QtWidgets
import interface
import requests
import json

class ExampleApp(QtWidgets.QMainWindow, interface.Ui_MainWindow):
    def __init__(self):
        # Это здесь нужно для доступа к переменным, методам
        # и т.д. в файле interface.py
        super().__init__()
        self.setupUi(self)  # Это нужно для инициализации нашего дизайна

def main():
    app = QtWidgets.QApplication(sys.argv)  # Новый экземпляр QApplication
    window = ExampleApp()  # Создаём объект класса ExampleApp
    window.show()  # Показываем окно
    app.exec_()  # и запускаем приложение

def item_price_sell (string_items):
    response_jita = requests.get(f"https://api.evemarketer.com/ec/marketstat/json?typeid={string_items}&usesystem=30000142")
    response_jita_json = json.loads(response_jita.text)
    for item in response_jita_json:
    #Квадратными скобками перемещаемся по списку через идентификаторы
        price = (item['sell']['min'])
    return price

def item_price_buy (string_items):
    response_jita = requests.get(f"https://api.evemarketer.com/ec/marketstat/json?typeid={string_items}&usesystem=30000142")
    response_jita_json = json.loads(response_jita.text)
    for item in response_jita_json:
    #Квадратными скобками перемещаемся по списку через идентификаторы
        price = (item['buy']['max'])
    return price

def res(n):
    research_price = ((item_price_sell('20411') * n + item_price_sell('20413') * n + item_price_sell('34205'))/0.489)*0.1
    return research_price



if __name__ == '__main__':  # Если мы запускаем файл напрямую, а не импортируем
    main()  # то запускаем функцию main()

#self.simple_asteroid_base_price.config()
crystal_type_b = item_price_sell('38')*113
crystal_type_b_ii = crystal_type_b + res(4) + item_price_sell('11483') + item_price_sell('16682')*10
income = item_price_buy('60283') - crystal_type_b_ii
print('Simple Asteroid Mining Cryslal Type B II - ', round(income,0), '/', round(crystal_type_b_ii))

crystal_moon_type_b = item_price_sell('38')*500
crystal_moon_type_b_ii = crystal_moon_type_b + res(4) + item_price_sell('11483') + item_price_sell('16682')*34
income = item_price_buy('61199') - crystal_moon_type_b_ii
print('Ubiquitous Moon Mining Crystal Type B II - ', round(income,0), '/', round(crystal_moon_type_b_ii))

crystal_complex_type_b = item_price_sell('38')*563
crystal_complex_type_b_ii = crystal_complex_type_b + res(8) + item_price_sell('11483') + item_price_sell('16682')*38
income = item_price_buy('60301') - crystal_complex_type_b_ii
print('Complex Asteroid Mining Crystal Type B II - ', round(income,0), '/', round(crystal_complex_type_b_ii))

crystal_var_type_b = item_price_sell('38')*450
crystal_var_type_b_ii = crystal_var_type_b + res(6) + item_price_sell('11483') + item_price_sell('16682')*29
income = item_price_buy('60295') - crystal_var_type_b_ii
print('Variegated Asteroid Mining Crystal Type B II - ', round(income,0), '/', round(crystal_var_type_b_ii))

crystal_merc_type_b = item_price_sell('38')*1114
crystal_merc_type_b_ii = crystal_merc_type_b + res(10) + item_price_sell('11483') + item_price_sell('16682')*48
income = item_price_buy('60311') - crystal_merc_type_b_ii
print('Mercoxit Asteroid Mining Crystal Type B II - ', round(income,0), '/', round(crystal_merc_type_b_ii))

crystal_moon_r_type_b = item_price_sell('38')*589
crystal_moon_r_type_b_ii = crystal_moon_r_type_b + res(8) + item_price_sell('11483') + item_price_sell('16682')*37
income = item_price_buy('61211') - crystal_moon_r_type_b_ii
print('Rare Moon Mining Crystal Type B II - ', round(income,0), '/', round(crystal_moon_r_type_b_ii))

В файле интерфейса этой строкой присваивается текст полю:

self.simple_asteroid_base_price.setText(_translate("MainWindow", "0"))

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

Где можно прочитать подробную информацию по правильной разработке структуры программы.

Понимаю, что это изначально фундаментальные знания. И соответственно нужно изменить поле Label на результат расчетов. Какой командой это будет исполняться?

Ответы

▲ 0Принят

Тяжелые/длительные расчеты выполняются в отдельном дополнительном потоке.

Signals & Slots и Support for Signals and Slots темы, которые вам надо крепко изучить.

Ваш дизайн далек от совершенства, поэтому я его не использовал. И мне не понятно зачем вам куча лабелов?

Я предложу вам попробовать например QTextBrowser

import sys
import requests
import json
from PyQt5 import QtCore, QtGui, QtWidgets

# import interface                                                # -
#from interface import Ui_MainWindow                              # +


class Thread(QtCore.QThread):
    dateSignal = QtCore.pyqtSignal(str)

    def __init__(self):
        super().__init__()

    def run(self):
        text = f'Расчет начат. Ожидайте результат.\n'       
        self.dateSignal.emit(text)
        self.msleep(10)
    
        crystal_type_b = self.item_price_sell('38')*113
        crystal_type_b_ii = crystal_type_b + self.res(4) \
            + self.item_price_sell('11483') + self.item_price_sell('16682')*10
        income = self.item_price_buy('60283') - crystal_type_b_ii
        text = f'Simple Asteroid Mining Cryslal Type B II     - ' \
               f'{round(income, 0):>10} / {round(crystal_type_b_ii):>7}'
        self.dateSignal.emit(text)
        self.msleep(10)

        crystal_moon_type_b = self.item_price_sell('38')*500
        crystal_moon_type_b_ii = crystal_moon_type_b + self.res(4) + self.item_price_sell('11483') + self.item_price_sell('16682')*34
        income = self.item_price_buy('61199') - crystal_moon_type_b_ii
#        print('Ubiquitous Moon Mining Crystal Type B II - ', round(income,0), '/', round(crystal_moon_type_b_ii))
        text = f'Ubiquitous Moon Mining Crystal Type B II     - ' \
               f'{round(income, 0):>10} / {round(crystal_moon_type_b_ii):>7}'
        self.dateSignal.emit(text)
        self.msleep(100)
        
        crystal_complex_type_b = self.item_price_sell('38')*563
        crystal_complex_type_b_ii = crystal_complex_type_b + self.res(8) + self.item_price_sell('11483') + self.item_price_sell('16682')*38
        income = self.item_price_buy('60301') - crystal_complex_type_b_ii
#        print('Complex Asteroid Mining Crystal Type B II -    ', round(income,0), '/', round(crystal_complex_type_b_ii))
        text = f'Complex Asteroid Mining Crystal Type B II    - ' \
               f'{round(income, 0):>10} / {round(crystal_complex_type_b_ii):>7}'
        self.dateSignal.emit(text)
        self.msleep(10)
        
        crystal_var_type_b = self.item_price_sell('38')*450
        crystal_var_type_b_ii = crystal_var_type_b + self.res(6) + self.item_price_sell('11483') + self.item_price_sell('16682')*29
        income = self.item_price_buy('60295') - crystal_var_type_b_ii
#        print('Variegated Asteroid Mining Crystal Type B II - ', round(income,0), '/', round(crystal_var_type_b_ii))
        text = f'Variegated Asteroid Mining Crystal Type B II - ' \
               f'{round(income, 0):>10} / {round(crystal_var_type_b_ii):>7}'
        self.dateSignal.emit(text)
        self.msleep(10)
        
        crystal_merc_type_b = self.item_price_sell('38')*1114
        crystal_merc_type_b_ii = crystal_merc_type_b + self.res(10) + self.item_price_sell('11483') + self.item_price_sell('16682')*48
        income = self.item_price_buy('60311') - crystal_merc_type_b_ii
#        print('Mercoxit Asteroid Mining Crystal Type B II - ', round(income,0), '/', round(crystal_merc_type_b_ii))
        text = f'Mercoxit Asteroid Mining Crystal Type B II   - ' \
               f'{round(income, 0):>10} / {round(crystal_merc_type_b_ii):>7}'
        self.dateSignal.emit(text)
        self.msleep(10)
        
        crystal_moon_r_type_b = self.item_price_sell('38')*589
        crystal_moon_r_type_b_ii = crystal_moon_r_type_b + self.res(8) + self.item_price_sell('11483') + self.item_price_sell('16682')*37
        income = self.item_price_buy('61211') - crystal_moon_r_type_b_ii
#        print('Rare Moon Mining Crystal Type B II - ', round(income,0), '/', round(crystal_moon_r_type_b_ii))
        text = f'Rare Moon Mining Crystal Type B II           - ' \
               f'{round(income, 0):>10} / {round(crystal_moon_r_type_b_ii):>7}'
        self.dateSignal.emit(text)
        self.msleep(10)    

        text = f'\nРасчет окончен {"-" * 50}'       
        self.dateSignal.emit(text)

    def item_price_sell (self, string_items):
        response_jita = requests.get(f"https://api.evemarketer.com/ec/marketstat/json?typeid={string_items}&usesystem=30000142")
        response_jita_json = json.loads(response_jita.text)
        for item in response_jita_json:
        #Квадратными скобками перемещаемся по списку через идентификаторы
            price = (item['sell']['min'])
        return price

    def item_price_buy (self, string_items):
        response_jita = requests.get(f"https://api.evemarketer.com/ec/marketstat/json?typeid={string_items}&usesystem=30000142")
        response_jita_json = json.loads(response_jita.text)
        for item in response_jita_json:
        #Квадратными скобками перемещаемся по списку через идентификаторы
            price = (item['buy']['max'])
        return price

    def res(self, n):
        research_price = ((self.item_price_sell('20411') * n + self.item_price_sell('20413') * n + self.item_price_sell('34205'))/0.489)*0.1
        return research_price    
    
    
class ExampleApp(QtWidgets.QMainWindow):                #, Ui_MainWindow):
    def __init__(self):
        super().__init__()
 
        self.centralwidget = QtWidgets.QWidget(self)
        self.setCentralWidget(self.centralwidget)
        
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        
        self.pushButton = QtWidgets.QPushButton('button', self.centralwidget)
        self.pushButton.clicked.connect(self.go_thread)
  
        layout = QtWidgets.QVBoxLayout(self.centralwidget)
        layout.addWidget(self.textBrowser)
        layout.addWidget(self.pushButton, alignment=QtCore.Qt.AlignRight)
        
        self.thread = Thread()
        self.thread.dateSignal.connect(self.update_data)

    def go_thread (self):
        self.thread.start()
        
    def update_data (self, text):
        self.textBrowser.append(text)


if __name__ == '__main__':  
    app = QtWidgets.QApplication(sys.argv) 
    app.setFont(QtGui.QFont("Consolas", 12, QtGui.QFont.Bold))  
    window = ExampleApp()
    window.resize(700, 400)
    window.show() 
    sys.exit(app.exec_()) 

введите сюда описание изображения

▲ 0

Используйте сигналы, слоты и отдельный поток для задач в фоне.
Бэкендов может быть туча, обработчики для каждого отдельно. Так же для компактности я сделал всё в одном файле, вы можете для удобства раскидать по файлам.
signal = pyqtSignal(int) Можно передать любой тип данных, что не маловажно.

import sys

from PyQt5.QtWidgets import QApplication, QGridLayout, QLabel, QWidget
from PyQt5.QtCore import QThread, pyqtSignal, pyqtSlot, Qt


class Backend(QThread):
    signal = pyqtSignal(int)

    def __init__(self):
        super().__init__()

    def run(self):
        for number in range(0, 500, 1):
            self.msleep(30)
            self.signal.emit(number)


class Frontend(QWidget):
    def __init__(self):
        super().__init__()

        self.setGeometry(300, 300, 500, 300)
        self.setWindowTitle("Пример использования сигналов и слотов в PyQt5")
        self.label = None
        self.ui()

        self.backend = Backend()
        self.backend.signal.connect(self.handler_signal)
        self.backend.start()

    def ui(self):
        self.label = QLabel()
        self.label.setStyleSheet("background: black; color: green; font-size: 125pt;")

        grid = QGridLayout()
        self.setLayout(grid)

        grid.addWidget(self.label, 0, 0, Qt.AlignCenter)

    @pyqtSlot(int)
    def handler_signal(self, value):
        self.label.setText(str(value))


def main():
    application = QApplication([])
    frontend = Frontend()
    frontend.show()
    sys.exit(application.exec_())


if __name__ == '__main__':
    main()