Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305

Аналог wx.Panel (wxPython) в PyQt5

11.02.2019, 09:19. Показов 2317. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо в GUI отображать SVG документ (создается через lxml). Также нужно (при необходимости) рисовать геометрические фигуры (поверх SVG).
В wxPython это все делается через объект wx.Panel: через wx.Bitmap можно отобразить SVG (после преобразования), а через wx.DC можно рисовать на панели.
Какой объект нужно использовать в PyQt5, чтобы получить такой же функционал?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.02.2019, 09:19
Ответы с готовыми решениями:

Wxpython. Panel скролл
Есть объект: self.m_panelDraw = wx.Panel(self.panel, -1, size=(400, 150),...

Wxpython. обновление wx.Panel
Есть панель, на которой размещена еще одна панель, причем вложенная панель отцентрирована. Вложенная панель: class...

WxPython. wx.Panel. Определить что под курсором
С помощью wx.DC нарисовал контур фигуры (см. приложение) на wx.Panel. Вопрос: возможно ли (может быть с помощью каких-либо hit-тестов)...

10
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
11.02.2019, 12:04
Лучший ответ Сообщение было отмечено ioprst как решение

Решение

В PyQt5.QtGui есть класс QPainter, а у каждого виджета есть метод def paintEvent(self, e) и если сделать класс наследник виджета и переопределить метод paintEvent, то можно рисовать на любом виджете, вот пример, рисуем cvg прямо на форме и сверху 3 линии

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
from PyQt5.QtWidgets import QWidget, QApplication, QLabel
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtSvg import QSvgRenderer
import sys
 
class Example(QWidget):
    
    def __init__(self):
        super().__init__()
 
        self.image =  QSvgRenderer('image.svg')
        
        self.initUI()
        
        
    def initUI(self):      
 
        self.setGeometry(300, 300, 280, 270)
        self.setWindowTitle('Картиника svg и линии')
        self.show()
        
 
    def paintEvent(self, e):
 
        qp = QPainter(self)
        qp.begin(self)
        self.image.render(qp)
        self.drawLines(qp)
        qp.end()
        
        
    def drawLines(self, qp):
      
        pen = QPen(Qt.black, 2, Qt.SolidLine)
 
        qp.setPen(pen)
        qp.drawLine(20, 40, 250, 40)
 
        pen.setStyle(Qt.DashLine)
        qp.setPen(pen)
        qp.drawLine(20, 80, 250, 80)
 
        pen.setStyle(Qt.DashDotLine)
        qp.setPen(pen)
        qp.drawLine(20, 120, 250, 120)
 
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
1
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
12.02.2019, 18:16
В Qt всё сделано цивильно, там объектов много, функциональность разделена.

Начать читать можно с https://doc.qt.io/archives/qt-... derer.html .

Цитата Сообщение от tooru Посмотреть сообщение
если сделать класс наследник виджета и переопределить метод paintEvent
Лучше всё-таки до этого не доводить. Вполне возможно, хватит стандартных объектов.
1
102 / 85 / 25
Регистрация: 21.05.2019
Сообщений: 481
20.08.2020, 14:06
ioprst, Модешь показать как на wx преобразование делал?
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
20.08.2020, 14:14  [ТС]
RSAX, какое преобразование?

Добавлено через 40 секунд
А SVG to Bitmap. Сейчас

Добавлено через 4 минуты
Сам wx выполнять преобразование не может (на сколько я знаю, в 4.1 уже может).
Преобразовать svg в png можно с помощью библиотеки cairosvg (либо выкручиваться через PyGObject, но это тянет за собой кучу зависимостей).
Функция преобразования:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import cairosvg
from io import BytesIO
import wx
 
def render_to_wxbitmap(data=None, scale=None):
    if not scale:
        scale = 1
 
    if data:
        png = cairosvg.svg2png(bytestring=data, scale=scale)
        img = wx.Image(BytesIO(png), wx.BITMAP_TYPE_PNG)
        bmp = wx.Bitmap(img)
        return bmp
    else:
        return None
Добавлено через 2 минуты
Тут можно пример посмотреть Преобразовать svg в bitmap
0
102 / 85 / 25
Регистрация: 21.05.2019
Сообщений: 481
20.08.2020, 16:05
Цитата Сообщение от ioprst Посмотреть сообщение
Тут можно пример посмотреть Преобразовать svg в bitmap
Эту ссылку находил, пример рабочий, но он преобразует в пнг и всё, а мне нужно чтобы он ещё и масштабировал svg при увеличении/уменьшении окна,. Думал может делали похожие решения
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
20.08.2020, 16:16  [ТС]
RSAX, попробуйте создать Bitmap из SVG. Нарисовать его на wx.Panel (можно переопределить обработчик wx.EVT_PAINT). Затем выполните масштабирование панели (не знаю что из этого выйдет). Для масштабирования используйте метод wx.Panel.SetScale(xs, xy). После вызова SetScale вызывайте перерисовку панели wx.Panel.Refresh().
1
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
24.08.2020, 11:55  [ТС]
Цитата Сообщение от RSAX Посмотреть сообщение
а мне нужно чтобы он ещё и масштабировал svg при увеличении/уменьшении окна
если вам необходимо, чтобы svg отображался на всю панель (с сохранением соотношения сторон), то вы можете вычислить нужный вам коэф-т масштабирования (зависит от текущего размера панели и svg), который будете передавать в функцию render_to_wxbitmap.
Примерно такой алгоритм:
Python
1
2
3
4
5
6
7
panel_width, panel_height = myPanel.GetClientSize()
rw = panel_width / svg_width
rh = panel_height / svg_height
if rw < rh:
    scale = rw
else:
    scale = rh
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
25.08.2020, 18:18
можно использовать QGraphicsView
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
from PyQt5.QtWidgets import (QWidget,QGridLayout,QPushButton,QApplication,
QGraphicsScene,QGraphicsView, QGraphicsItem, QFileDialog, QDoubleSpinBox)
from PyQt5.QtCore import Qt, QRectF, QRect, QSize
from PyQt5.QtGui import QPainter
from PyQt5.QtSvg import QSvgRenderer, QSvgWidget, QSvgGenerator, QGraphicsSvgItem
 
class View(QWidget):
    def __init__(self):
        super().__init__()
        self.scene = QGraphicsScene(self)
        self.view = QGraphicsView(self.scene)
        self.view.setRenderHint(QPainter.Antialiasing)
        grid = QGridLayout(self)
        grid.setContentsMargins(0,0,0,0)
        grid.addWidget(self.view,0,0,8,8)
        self.btnLoad = QPushButton('Load')
        self.btnClear = QPushButton('Clear')
        grid.addWidget(self.btnLoad,8,0,1,1)
        grid.addWidget(self.btnClear,8,1,1,1)
        self.btnLoad.clicked.connect(self.on_load)
        self.btnClear.clicked.connect(self.on_clear)
        self.box = QDoubleSpinBox()
        self.box.setRange(-2,2)
        self.box.setSingleStep(0.01)
        self.box.setValue(1)
        self.box.valueChanged.connect(self.on_box)
        grid.addWidget(self.box,8,3,1,1)
    
    def resizeEvent(self,event):
        self.view.setSceneRect(QRectF(self.view.viewport().rect()))
    
    def on_load(self):
        name,_ = QFileDialog.getOpenFileName(self,'Load','','*.svg')
        if not name: return
        pos = 10
        w = QGraphicsSvgItem(name)
        w.setFlags(QGraphicsItem.ItemIsMovable|QGraphicsItem.ItemIsSelectable)
        w.setScale(1)
        self.scene.addItem(w)
        w.setPos(pos,pos)
                
    def on_clear(self):
        self.scene.clear()
        
    def on_box(self,value):
        items = self.scene.selectedItems()
        if not items: return
        item = items[0]
        item.setScale(value)
        
        
 
if __name__ == '__main__':
    app = QApplication([])
    w = View()
    w.resize(800,600)
    w.show()
    app.exec_()
1
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
26.08.2020, 08:12  [ТС]
vic5710, можно. Но тут про wx, он так с SVG не может (хотя в 4.1 вроде бы уже можно рисовать svg, но медленно)
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
26.08.2020, 09:42
Цитата Сообщение от ioprst Посмотреть сообщение
Какой объект нужно использовать в PyQt5, чтобы получить такой же функционал?
ответ на тему

Добавлено через 7 минут
wx не знаю, но можно сделать svg->png
https://stackoverflow.com/ques... -in-python
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.08.2020, 09:42
Помогаю со студенческими работами здесь

Компонент аналог AlphaBlendTextBox но для panel
Здравствуйте. На просторах интернета я нашел компонент AlphaBlendTextBox. Вот его ссылка: ...

Все методы и атрибуты PyQt5.QtGui PyQt5.Qtwdigets и QtCore
На официальной документации модуля я не нашёл все методы и атрибуты PyQt5. может дадите источник со всем этим добром??? Буду вам очень...

Unable to import 'PyQt5' / No module named 'PyQt5' /
Здравствуйте. Имеется Ubuntu 18.04. Хочу использовать pyside2. Установил PyQt5. :~$ pip install PyQt5 Defaulting to user...

В Panel-е не появляется скрол, а сам Panel выезжает за границу экрана
Здравстуйте, уважаемые форумчане! Столкнулся со следующей проблемой, на веб-странице есть таблица которая динамически заполняется данными...

SIEMENS SIMATIC PANEL Touch Panel TP 170B Color - скачать программу для разбора
На работе есть, указанная в названии темы панель. Ни когда не имел дела с подобным. Простой вопрос: Есть ли возможность скачать...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
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-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru