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

Рисование в отдельном окне по параметрам, заданным в текстовых окнах

11.06.2023, 20:03. Показов 1039. Ответов 4

Студворк — интернет-сервис помощи студентам
Всем привет!
Просьба: сильно не пинать, нах не посылать (лучше ссылки правильные дать).
Я - новичок, но азы Питона немного освоил. Хочу для себя написать программу, в которой можно рассчитывать и визуализировать сварной каркас. То есть, например, есть несколько окон в интерфейсе, в которые я буду вводить данные: ширина, длина, высота, сечение балки... И по ходу ввода данных в отдельном окне должно рисоваться то, что я ввожу. Конечно, оптимальным вариантом было бы 3d изображение, но, как минимум, хватит и изометрической проекции.
Какие библиотеки мне необходимо подключить и где посмотреть примеры?
Спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.06.2023, 20:03
Ответы с готовыми решениями:

Рисование в отдельном окне
Здравствуйте, нужна ваша помощь. Как в Qt реализовать рисование в отельном окне? Ничего сложного не нужно, прямоугольники, линии и текст....

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

Рисование разных фигур в окнах
На экране построить линию, вершины которой задаются кнопкой мышки. Построить равнобедренный треугольник, основанием которого является...

4
30 / 27 / 11
Регистрация: 03.06.2023
Сообщений: 73
11.06.2023, 23:46
Задача громоздкая, скорее всего есть специализированное ПО для этого.
Но все же дерзай:
NumPy - библиотека для работы с математическими вычислениями - https://pythonworld.ru/numpy
Matplotlib - библиотека для создания графиков и визуализации данных - https://matplotlib.org/stable/contents.html
Mayavi - библиотека для 3D с использованием OpenGL - https://docs.enthought.com/mayavi/mayavi/
Tkinter - библиотеки для создания интерфейса программы - https://metanit.com/python/tkinter/

Примеры по mayavi:
https://habr.com/ru/articles/115170/
https://github.com/enthought/mayavi
1
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
12.06.2023, 01:39
http://fsweb.info/caecad/
CAD всякие есть, может подойдет что то
задача выполнимая, но длинная и нудная
https://github.com/FreeCAD/FreeCAD
прикинь потянешь ли такое

Добавлено через 25 минут
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
from PyQt5.QtWidgets import (
QWidget,QGridLayout,QRadioButton,QMainWindow, QApplication,
QCheckBox,QGroupBox, QVBoxLayout,QLabel,QPushButton,
QGraphicsScene,QGraphicsView,QGraphicsItem,
QGraphicsRectItem,QGraphicsLineItem,QGraphicsEllipseItem,
)
from PyQt5.QtCore import Qt, QRectF, QPointF, QLineF, pyqtSignal
from PyQt5.QtGui import QColor, QPainter, QPen, QBrush,QTransform
from random import sample
 
def get_color():
    r,g,b,a = sample([92,128,168,192,224,255],4)
    return QColor(r,g,b,a) 
 
class HoverItem:
    def __init__(self):
        self.setFlag(QGraphicsItem.ItemIsMovable)
        self.setFlag(QGraphicsItem.ItemIsSelectable)
        self.setFlag(QGraphicsItem.ItemIsFocusable)
        self.setAcceptHoverEvents(True)
        self._brush = None
        
    def hoverEnterEvent(self,e):
        self.scene()._hover.emit(True)
        self._zvalue = self.zValue()
        self.setZValue(1)
        try:
            self._brush = self.brush()
            self.setBrush(QColor(220,220,220,127))
        except: pass
            
    def hoverLeaveEvent(self,e):
        self.scene()._hover.emit(False)
        self.setZValue(self._zvalue)
        if self._brush:
            self.setBrush(self._brush)
            self._brush = None
 
class RectItem(QGraphicsRectItem, HoverItem):
    def __init__(self,parent=None):
        super().__init__()
        HoverItem.__init__(self)
 
class EllipseItem(QGraphicsEllipseItem,HoverItem):
    def __init__(self,parent=None):
        super().__init__()
        HoverItem.__init__(self)
 
 
class LineItem(QGraphicsLineItem,HoverItem):
    def __init__(self,parent=None):
        super().__init__()
        HoverItem.__init__(self)
                
class GraphicsScene(QGraphicsScene):
    _draw = pyqtSignal(bool)
    _hover = pyqtSignal(bool)
    def __init__(self,parent=None):
        super().__init__(parent)
        self._pos = QPointF()
        self._name = None
        self._item = None
        self._mode = False
        self.setBackgroundBrush(QColor(63,63,63,7))
        self.selectionChanged.connect(self.on_select)
        
    def on_select(self):
        items = self.selectedItems()
        #print(items)
 
    def mousePressEvent(self, event):
        if not self._mode: 
            super().mousePressEvent(event)
            return
        if self.itemAt(event.scenePos(), QTransform()):
            return
        if self._name == 'Rect': 
            self._item = RectItem()
        elif self._name == 'Ellipse': 
            self._item = EllipseItem()
        elif self._name == 'Line': 
            self._item = LineItem()
        self._pos = event.scenePos()
        if type(self._item) is LineItem: 
            self._item.setLine(QLineF(self._pos,self._pos))
            self._item.setPen(QPen(Qt.black,1.0,Qt.DotLine))
        else: 
            self._item.setRect(QRectF(self._pos, self._pos))
            self._item.setPen(QPen(Qt.black,1.0,Qt.DotLine))
        self.addItem(self._item)
        self._draw.emit(True)
 
    def mouseMoveEvent(self, event):
        if not self._mode: 
            super().mouseMoveEvent(event)            
            return
        if self._item:
            if type(self._item) is LineItem:
                self._item.setLine(QLineF(self._pos,event.scenePos()))
            else:
                rect = QRectF(self._pos, event.scenePos()).normalized()
                self._item.setRect(rect)
 
    def mouseReleaseEvent(self, event):
        if not self._mode: 
            super().mouseReleaseEvent(event)
            return
        if self._item:
            try: 
                self._item.setPen(QPen(get_color(),2,Qt.SolidLine))
                self._item.setBrush(get_color())
            except: 
                pass
            self._item = None
            self._draw.emit(False)
 
class View(QWidget):
    def __init__(self):
        super().__init__()
        self.scene = GraphicsScene(self)
        grid = QGridLayout(self)
        grid.setContentsMargins(0,0,0,0)
 
        self.view = QGraphicsView(self.scene)
        self.view.setRenderHint(QPainter.Antialiasing)
        self.view.setSceneRect(QRectF(0,0,600,400))
        grid.addWidget(self.view,0,0,8,8)
 
        self.group = QGroupBox()
        self.btns = []
        vbox = QVBoxLayout(self.group)        
        for i in ('Line','Rect','Ellipse'):
            btn = QPushButton(i)
            btn.setCheckable(True)
            self.btns.append(btn)
            vbox.addWidget(btn)
            btn.clicked.connect(self.on_group_box)
            if i == 'Rect': btn.click()
        grid.addWidget(self.group,0,8)
        
        box = QPushButton('Select')
        box.setCheckable(True)
        grid.addWidget(box,1,8)
        
        box.toggled.connect(self.on_box)
        self.scene._draw.connect(self.on_draw)
        self.scene._hover.connect(self.on_hover)
        self.on_box(False)
        
    def on_draw(self,value):
        if value: self.setCursor(Qt.CrossCursor)
        else: self.setCursor(Qt.ArrowCursor)
 
    def on_group_box(self,value):
        sender = self.sender()
        for btn in self.btns: btn.setChecked(False)
        sender.setChecked(True)
        self.scene._name = sender.text()
        
    def on_hover(self,value):
        if value: self.setCursor(Qt.ClosedHandCursor)
        else: self.setCursor(Qt.ArrowCursor)
        
    def on_box(self,value):
        self.scene._mode = not value
        self.group.setEnabled(not value)
        
 
if __name__ == '__main__':
    app = QApplication([])
    w = View()
    w.show()
    app.exec_()
вот простая рисовалка
3
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 23
12.06.2023, 08:30  [ТС]
Спасибо, вечером попробую разобраться. Может быть я действительно замахнулся на сложную задачу и можно было бы обойтись готовым приложением, но не знаю, что можно для этого использовать.
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
12.06.2023, 18:43
Shaman Weeder, упростил рисовалку
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
from PyQt5.QtWidgets import (
QWidget,QGridLayout,QRadioButton,QMainWindow, QApplication,
QCheckBox,QGroupBox, QVBoxLayout,QLabel,QPushButton,QSpinBox,
QGraphicsScene,QGraphicsView,QGraphicsItem,
QGraphicsRectItem,QGraphicsLineItem,QGraphicsEllipseItem,
)
from PyQt5.QtCore import Qt, QRectF, QPointF, QLineF, pyqtSignal
from PyQt5.QtGui import QColor, QPainter, QPen, QBrush,QTransform
from random import sample
 
def get_color():
    r,g,b,a = sample([92,128,168,192,224,255],4)
    return QColor(r,g,b,a) 
 
def set_flags(item):
    item.setFlags(QGraphicsItem.ItemIsMovable | QGraphicsItem.ItemIsSelectable | QGraphicsItem.ItemIsFocusable)
 
                
 
class View(QWidget):
    def __init__(self):
        super().__init__()
        self._name = None
        self.d = {'X0: ':10,'Y0: ':20,'X1: ':100,'Y1: ':200}
        self.scene = QGraphicsScene(self)
        self.scene.setBackgroundBrush(QColor(63,63,63,7))
        self.scene.selectionChanged.connect(self.on_scene)
        
        self.view = QGraphicsView(self.scene)
        self.view.setRenderHint(QPainter.Antialiasing)
        self.view.setSceneRect(QRectF(0,0,600,400))
 
        grid = QGridLayout(self)
        grid.setContentsMargins(0,0,0,0)
        grid.addWidget(self.view,0,0,8,8)
        
        vbox = QVBoxLayout()        
        for i in ('Line','Rect','Ellipse'):
            btn = QRadioButton(i)
            vbox.addWidget(btn)
            btn.clicked.connect(self.on_radio)
        grid.addLayout(vbox,1,8)
 
        vbox = QVBoxLayout()
        for i in (self.d):
            sb = QSpinBox()
            sb.setPrefix(i)
            sb.setRange(0,1000)
            sb.setValue(self.d[i])
            sb.valueChanged.connect(self.on_sb)
            vbox.addWidget(sb) 
        grid.addLayout(vbox,2,8)
        
        btn = QPushButton('Select')
        grid.addWidget(btn,3,8)
        btn.clicked.connect(self.on_select)
        
    def on_scene(self):
        items = self.scene.selectedItems()
        #print(items)
 
    def on_radio(self,value):
        self._name = self.sender().text()
    
    def on_sb(self):
        self.d[self.sender().prefix()] = self.sender().value()
        #print(self.d)
        
    def on_select(self):
        x0,y0,x1,y1 = self.d['X0: '],self.d['Y0: '],self.d['X1: '],self.d['Y1: ']
        if self._name == 'Rect':
            item = self.scene.addRect(x0,y0,x1-x0,y1-y0,pen=get_color(),brush=get_color())
        elif self._name == 'Line':
            item = self.scene.addLine(x0,y0,x1,y1,pen=get_color())
        elif self._name == 'Ellipse':
            item = self.scene.addEllipse(x0,y0,x1-x0,y1-y0,pen=get_color(),brush=get_color())
        if self._name: 
            set_flags(item)
                
if __name__ == '__main__':
    app = QApplication([])
    w = View()
    w.show()
    app.exec_()
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.06.2023, 18:43
Помогаю со студенческими работами здесь

Выборка на отдельном листе по параметрам из двух столбцов
Доброго времени суток! Для контроля поручений руководителя веду в экселе список поручений. На первом листе список всех поручений,...

Рисование в отдельном Layout
Как по нажатию на кнопку нарисовать линию (допустим) в отдельном каком-то layout.

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

Фильтр по заданным параметрам из БД
Здравствуйте, господа. Есть проблема. Подключил я на своем сайте БД, из которой выводятся данный в таблицу в блоке <div></div>....

Заголовок в отдельном окне IE
Как настроить имя заголовка в отдельном окне, которое открывается? Изначально идёт ссылка - Имя старницы - Имя Сайта - Само название...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru