@the_same_Gonta

Не отображаются виджеты, приложение виснет, где ошибка?

Написал код приложения, которое мониторит курс рубля к Тенге, состоящее из 2 файлов.
tng.py:
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QPushButton, QVBoxLayout,
QHBoxLayout, QApplication, 
QWidget,QPushButton, QLabel, QVBoxLayout)
from PyQt5.QtGui import  QFont
from pars import *
def pril(adr):
    class Kurz(QWidget):
        def __init__(self):
            super().__init__()
            self.set_appear()
            self.adr = adr
            self.initUI()
            self.show()
            self.server = Server(self.adr)
            self.setting()
        def set_appear(self):
            self.setWindowTitle("Отслеживание курса Тенге (RUB/KZT)")
            self.setFixedSize(525, 315)
            self.setStyleSheet("background-color: rgb(29, 29, 29);")
        def initUI(self):
            #виджеты
            self.adress_lbl = QLabel("Ваш адресс электронной почты: "+self.adr)
            self.label = QLabel("1 российский рубль (RUB) равно")
            self.now_tng_lbl = QLabel("0.00\nКазахстанский \nтенге")
            self.old_tng_lbl = QLabel("Было ранее: \n0.00")
            self.comment_lbl = QLabel("Курс стабилен.")
            #стилизация
            self.adress_lbl.setStyleSheet("font: 9pt \"Bahnschrift SemiLight\";\n"
            "color: rgb(255, 255, 255);")
            self.label.setStyleSheet("font: 63 13pt \"Bahnschrift SemiBold SemiConden\";\n"
            "color: rgb(255, 255, 255);")
            self.now_tng_lbl.setStyleSheet("font: 63 17pt \"Bahnschrift SemiBold SemiConden\";\n"
            "color: rgb(255, 255, 255);")
            self.old_tng_lbl.setStyleSheet("font: 10pt \"Bahnschrift SemiLight\";\n"
            "color: rgb(255, 255, 255);")
            self.comment_lbl.setStyleSheet("font: 12pt \"Bahnschrift SemiLight\";\n"
            "color: rgb(255, 255, 255);")
            #лейауты
            self.l_line = QVBoxLayout()
            self.r_line = QVBoxLayout()
            self.h_line = QHBoxLayout()
            #добавление виджетов
            self.l_line.addWidget(self.adress_lbl, alignment=Qt.AlignLeft)
            self.l_line.addWidget(self.label, alignment=Qt.AlignLeft)
            self.l_line.addWidget(self.now_tng_lbl, alignment=Qt.AlignLeft)
            self.l_line.addWidget(self.comment_lbl, alignment=Qt.AlignLeft)
            self.r_line.addWidget(self.old_tng_lbl, alignment=Qt.AlignRight)
            #закрепление лейаутов
            self.h_line.addLayout(self.l_line)
            self.h_line.addLayout(self.r_line)
            self.setLayout(self.h_line)
        def setting(self):
            self.server.check_currency()
            self.new = str(self.server.cash)
            self.old = str(self.server.current_converted_price)
            self.com = self.server.situation
            self.adress_lbl.setText("Ваш адресс электронной почты: "+self.adr)
            self.now_tng_lbl.setText(self.new+"\nКазахстанский \nтенге")
            self.old_tng_lbl.setText("Было ранее: \n"+self.old)
            self.comment_lbl.setText(self.com)
            print("set")
            self.setting()
    app = QApplication([])
    window1 = Kurz()
    app.exec_()
pril("f")


И pars.py:
import requests 
from bs4 import BeautifulSoup 
import time 
import smtplib 


class Server:
	TENGE_RUB = 'https://www.google.ru/search?q=курс+рубля+к+тенге&newwindow=1&sca_esv=596363404&sxsrf=AM9HkKl-cocS6CYekDrkXuIiE6IwwZXQDQ%3A1704634548790&source=hp&ei=tKiaZemLLs3NwPAPkY-nyAg&iflsig=AO6bgOgAAAAAZZq2xDogfVfFIJkaJK2Pqg3dUcQpe9fH&udm=&oq=курс+рубля+к+тен&gs_lp=Egdnd3Mtd2l6Ih3QutGD0YDRgSDRgNGD0LHQu9GPINC6INGC0LXQvSoCCAAyDRAAGIAEGLEDGEYYggIyBRAAGIAEMgUQABiABDIFEAAYgAQyBRAAGIAEMgUQABiABDIFEAAYgAQyBRAAGIAEMgUQABiABDIFEAAYgARIhYcBUJoMWMlucAp4AJABA5gB6QOgAdwjqgEKMS4yMS4yLjEuMrgBAcgBAPgBAagCCsICEBAAGAMYjwEY5QIY6gIYjAPCAhAQLhgDGI8BGOUCGOoCGIwDwgILEC4YgAQYsQMYgwHCAg4QLhiABBixAxjHARjRA8ICCxAAGIAEGLEDGIMBwgIIEAAYgAQYsQPCAhEQLhiABBixAxiDARjHARjRA8ICCBAuGIAEGLEDwgIOEAAYARiABBjJAxgKGCrCAgkQABgBGIAEGArCAgcQABiABBgKwgILEAAYgAQYigUYkgPCAg4QABiABBiKBRixAxiDAcICBBAuGAPCAg4QLhiABBiKBRixAxiDAcICCxAuGIAEGMcBGK8BwgIOEAAYgAQYsQMYgwEYyQPCAggQABiABBiSA8ICDhAAGIAEGLEDGIMBGJIDwgIKEAAYgAQYRhiCAsICDBAAGIAEGAoYRhiCAsICChAAGIAEGAoYsQM&sclient=gws-wiz'
	headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
	current_converted_price = 0
	difference = 1.2 # разница 
	def __init__(self, adr):
		self.current_converted_price = float(self.get_currency_price().replace(",", "."))
		self.adress = adr
		print("ready")
	def get_currency_price(self):
		full_page = requests.get(self.TENGE_RUB, headers=self.headers)
		soup = BeautifulSoup(full_page.content, 'html.parser')
		convert = soup.findAll("span", {"class": "DFlfde", "class": "SwHCTb", "data-precision": 2})
		return convert[0].text
	def check_currency(self):
		print("zap")
		currency = float(self.get_currency_price().replace(",", "."))
		if currency >= self.current_converted_price + self.difference:
			print("Курс сильно вырос.")
			self.situation = "Курс сильно вырос."
			self.send_mail()
		elif currency <= self.current_converted_price - self.difference:
			print("Курс сильно упал.")
			self.situation = "Курс сильно упал."
			self.send_mail()
		else:
			self.situation = "Курс стабилен"
		self.cash = currency
		print("Сейчас курс: 1 Тенге = " + str(currency))
		time.sleep(10) # Засыпание
	def send_mail(self):
		server = smtplib.SMTP('smtp.gmail.com', 587)
		server.ehlo()
		server.starttls()
		server.ehlo()
		server.login('ingener715@gmail.com', 'lpmh bkgh ipqy hqdu')
		subject = 'Курс Тенге'
		body = self.situation 
		message = f'Subject: {subject}\n{body}'
		server.sendmail(
			'ingener715@gmail.com',
			self.adress,
			message
		)
		server.quit()


Так же есть 3 файл(начальный) но он вырезан, в первом файле использована функция, которая заменяет его.

При запуске происходит данные о курсе тенге выводятся в консоль, но само приложение не отвечает (белый экран)

Как это можно исправить\оптимизировать?
  • Вопрос задан
  • 42 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
def setting(self):
    self.server.check_currency()
    ...
    self.setting()

Что это за *непроизносимое марсианское ругательство*?
Во-первых, ты реализуешь (вечный?) цикл через рекурсию, что само по себе глупо. Рекурсия куда более ограниченная штука, хотя бы из-за глубины стека.
Во-вторых, у тебя именно что бесконечный цикл - ты не даёшь программе передышки, чтобы она могла отрисовать окно. По сути, у тебя выполнение зациклится намертво на строке window1 = Kurz(), так как приложение уйдёт в рекурсивный вызов self.setting() и из него уже не вернётся.

Первая же ссылка в гугле по запросу "pyqt timer" даёт пример, как периодически обновлять содержимое окна, используя QTimer.

Сначала читай, потом думай, потом уже бросайся делать.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы