Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 21.12.2022
Сообщений: 3

Как отобразить новый Label в уже отрисованном окне?

18.07.2023, 02:38. Показов 839. Ответов 3

Студворк — интернет-сервис помощи студентам
Я пишу простую программу, которая принимает ссылку, парсит изображение и текст по ссылке, после записывает спаршенный текст в бд. При запуске, программа должна отобразить изображение и текст в интерфейсе, я пытаюсь отобразить текст и изображение сразу после парсинга, т.е в уже открытом интерфейсе, а не только после перезапуска. Для этого я запускаю функцию для отрисовки label сразу после парсинга, я несколько раз проверял и точно убедился что изображение и текст успевают спарситься и сохраниться, но не отрисовываются в интерфейсе, как это можно исправить? Вот код

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import sys 
from PySide6 import QtWidgets, QtGui, QtCore
from PySide6.QtWidgets import QApplication, QMainWindow, QHBoxLayout, QLabel, QVBoxLayout
from main_v1 import Ui_LIBRFILM
from newfilm_v1 import Ui_Dialog
from PySide6.QtGui import QPixmap, QIcon, QPainter, QBitmap, QFont
from PySide6.QtUiTools import QUiLoader
from PySide6.QtCore import QPoint, Qt, QRect
 
 
from parse import parse_new_film
from conDB import add_film, read_db
 
 
class libr(QMainWindow):
    def __init__(self):
        super(libr, self).__init__()
        self.ui = Ui_LIBRFILM()
 
        self.ui.setupUi(self)
 
        self.ui.pushButton.clicked.connect(self.add_film_new_wind)
 
    def labels(self):
        row = read_db()
        
 
        
 
        len_row = (len(row))
        xx = 0
        yy= -1
 
        move_x = 15
        move_y = 15
 
        move_x_b = 0
        move_y_b = 0
        while xx != len_row:
            yy = yy+1
            name = row[yy][0]
            print(name)
            
            self.initUI(name, move_x, move_y, move_x_b, move_y_b)
  
 
            move_x = move_x + 215 #максимум 1735
            if move_x>1735:
                move_x = 15
                move_y = move_y + 325
            xx = xx+1
            move_x_b = move_x+215
            if move_x_b>1735:
                move_x_b = 15
                move_y_b = move_y_b + 330
 
 
 
 
 
    def add_film_new_wind(self):
        self.new_window = QtWidgets.QDialog()
        self.ui_window = Ui_Dialog()
        self.ui_window.setupUi(self.new_window)
        self.new_window.show()
        self.ui_window.pushButton1.clicked.connect(self.film)
 
    def film(self):
        a = self.ui_window.textEdit.toPlainText()
        name = parse_new_film(a)
        add_film(name)
        self.labels()
        self.new_window.close()
 
    def initUI(self, name, move_x, move_y, move_x_b, move_y_b):
        label_png = QLabel(self)
        label_name = QLabel(self)
 
 
        # Text label
        print(name)
        label_name.setText(label_name.text()+name)
        label_name.move(move_x+10, move_y+275)
        label_name.setFont(QtGui.QFont("Arial", 10, QFont.Bold))
        label_name.resize(151, 35)
        label_name.setWordWrap(True)
        label_name.setStyleSheet("color: rgb(255,255,255)")
        label_name.setAlignment(Qt.AlignCenter)
 
 
 
        # PNG Label
        pixmap = QPixmap("posters/"+name+'.png')
        label_png.setPixmap(pixmap)
 
        label_png.setScaledContents(True)
        label_png.move(move_x, move_y)
        label_png.resize(171, 271)
        rounded_rect = QtGui.QPainterPath()
        rounded_rect.addRoundedRect(QtCore.QRectF(0, 0, label_png.width(), label_png.height()), 25, 25)
        mask = QtGui.QRegion(rounded_rect.toFillPolygon().toPolygon())
        label_png.setMask(mask)
 
 
 
        
    
 
 
        
        self.ui.pushButton.move(move_x_b, move_y_b)
        
 
    
    
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = libr()
    window.labels()
    window.show()
    
    sys.exit(app.exec())
Функция labels определяет координаты для отрисовки label и запускает функцию initUI
Функция add_film_new_wind это функция для нового диалогового окна(оно принимает ссылку) и привязки к функции film
Функция film получает ссылку, отправляет в другую функцию для парсинга, получает текст (имя изображения=текст), записывает текст в бд, и вызывает labels для отрисовки всех label, включая новый, только добавленный label (который не получается отрисовать)
Функция initUI отрисовывает все label

Почему функция film не добавляет новый label, как это исправить? Кстати, после перезапуска программы этот label добавляется, мне кажется проблема в том, что интерфейс никак не обновляется из за чего label не видно, я пытался закрывать интерфейс и открывать, перезагружать label, писал отдельную функцию для отрисовки последнего добавленного label а не всех сразу, но исправить проблему не получилось. Буду очень благодарен за любую помощь, заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.07.2023, 02:38
Ответы с готовыми решениями:

Как рисовать на уже отрисованном QGraphicsItem?
QGraphicsLineItem *myLine = scene->addLine(10,10,25,25,QPen(Qt::black,3)); Подскажите, как после этого хотя бы цвет линии поменять.

Событие, возникающие когда контролы расположились на форме в отрисованном окне
Когда все контролы инициализированы возникает событие Loaded. private void Window_Loaded(object sender, RoutedEventArgs e) { ...

Как отобразить информацию (введенную в форму), в новом окне и во всплывающем окне?
Подскажите пожалуйста, у меня есть форма в нее делаю запись, как сделать так, что бы после введения данных они отобразились в 2 ух окнах...

3
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
18.07.2023, 08:09
sevostei, для начала почитай про область видимости переменных. Потом почитай что такое поля класса и их отличие от обычных переменных.
2
0 / 0 / 0
Регистрация: 21.12.2022
Сообщений: 3
18.07.2023, 16:23  [ТС]
Для того что бы отобразить новый label его нужно было создать отдельно и использовать label.show(). Но я не понял причем тут область видимости переменных и поля класса?
0
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
19.07.2023, 11:11
sevostei, однако iSmokeJC прав. Не получится нахрапом с дизайнером наперевес сделать то, что Вы хотите без понимания происходящих процессов. Ладно я помню, что когда-то что-то подобное делал. Там правда PyQt5, но переделать под PySide6 можно без проблем. Проверить-то сейчас не могу, но вроде криминала особого нет, должно работать:

dcp_005.py:
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
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""Dynamic Central Probe v0.005
 
Добавление и удаление дочерних виджетов в центральный виджет
по запросу пользователя (имитатор).
"""
 
import sys, random
from PySide6.QtGui import QCursor
from PySide6.QtCore import QTimer
from PySide6.QtWidgets import QApplication
from PySide6.QtWidgets import QWidget, QPushButton
from PySide6.QtWidgets import QHBoxLayout, QVBoxLayout
from PySide6.QtWidgets import QMainWindow, QProgressBar
 
APP_NAME = "Dynamic Central Probe v0.005"
 
class Progressbar_for_imitator(QProgressBar):
    def to_next_value(self):
        self.setValue(self.value() + 1)
 
class Probe_main_window(QMainWindow):
    """Главное окно приложения
    """
    def __init__(self, parent=None):
        super(Probe_main_window, self).__init__(parent)
        self.init_ui()
 
    def init_ui(self):
        self.setWindowTitle(APP_NAME)
        self.statusBar()
        self.central_widget = QWidget(self)
        add_button = QPushButton("Пуск", self)
        hbox = QHBoxLayout()
        hbox.addWidget(add_button)
        hbox.addStretch(1)
        self.central_widget.vbox = QVBoxLayout()
        main_box = QVBoxLayout()
        main_box.addLayout(self.central_widget.vbox)
        main_box.addStretch(1)
        main_box.addLayout(hbox)
        self.central_widget.setLayout(main_box)
        self.setCentralWidget(self.central_widget)
        add_button.clicked.connect(self.to_add_progressbar)
 
        # Центруем и меняем размеры окна под экран, на котором находится
        # указатель мыши (необходимо для Linux и Windows не портит)
        selected_screen = QApplication.screenAt(QCursor.pos())
        current_geo = selected_screen.availableGeometry()
        self.move(current_geo.x() + current_geo.width() // 4,
                  current_geo.y() + current_geo.height() // 4)
        self.resize(current_geo.width() // 2,
                    current_geo.height() // 2)
 
    def to_add_progressbar(self):
        pbar = Progressbar_for_imitator(self)
        pbar.setRange(0, random.randint(1, 10)*10)
        pbar.valueChanged.connect(self.to_pbar_valuechanged)
        pbar.setValue(0)
        self.central_widget.vbox.addWidget(pbar)
 
    def to_pbar_valuechanged(self, value):
        if value < self.sender().maximum():
            QTimer.singleShot(random.choice([100,150,200]),
                              self.sender().to_next_value)
        else:
            self.central_widget.vbox.removeWidget(self.sender())
            self.sender().deleteLater()
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    mwin = Probe_main_window()
    mwin.show()
    sys.exit(app.exec_())
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.07.2023, 11:11
Помогаю со студенческими работами здесь

При наведении курсора на изображение в одном окне, отобразить ее свойства в другом окне
Постановка задачи следующая: Имеется главное окно. По кнопке открывает еще два окна: &lt;html&gt; &lt;head&gt; &lt;meta...

Меняется текст Label'a в первом окне при изменении пункта comboBox во втором окне
Добрый день. Никак не могу пофиксить баг (или не баг, а глупость). Есть главное окно StartWindow, с которого открывается окно...

Перенести текст с одного label на label в другом окне
Как перенести текст с label одного окна в label другого окна? ссылка на гитхаб: https://github.com/tim-stark-m45/WPF_ViewTest

Как в отобразить текст в Label
https://www.cyberforum.ru/windows-forms/thread1749432.html - Корни вопроса отсюда Отдельный вопрос создал. Но я решил сделать всё...

Как сделать label() в дочернем окне?
Друзья, не могу разобраться, как сделать label() в дочернем окне. Нашел в интернете, что нужно брать рут класса дочернего окна, однако я не...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru