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

Поведение функции отрисовки show() внутри цикла. Python/OpenGL. Создание анимации

27.10.2018, 22:52. Показов 1779. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Имеется объект графического интерфейса ui. Столкнулась с проблемой, что вне зависимости от расположения функции ui.sphere.show() внутри цикла непосредственно отрисовка происходит только после выполнения всех итераций. Результат: отрисовка только по результатам последних данных. Подскажите, пож-та, как можно решить данную проблему и с чем она связана. Прилагаю код.

.......
ui.sphere = SphereWidgetDemo()
while count <= num_of_iterations:
global color_init
color_init = []
global x_init
x_init = []
global y_init
y_init = []
global z_init
z_init = []
for l in range(len(s)):
if count <= len(result_list[l]):
if (result_list[l][count-1]._color == 'red'):
color_init.append([1.0, 0.0, 0.0, 1.0])
else:
if (result_list[l][count-1]._color == 'blue'):
color_init.append([0.0, 0.0, 1.0, 1.0])
else:
if (result_list[l][count-1]._color == 'green'):
color_init.append([0.0, 0.0, 1.0, 1.0])
else:
if (result_list[l][count-1]._color == 'orange'):
color_init.append([1.0, 0.6, 0.0, 1.0])
else:
color_init.append([1.0, 1.0, 0.0, 1.0])
x_init.append(result_list[l][count-1]._x)
y_init.append(result_list[l][count-1]._y)
z_init.append(result_list[l][count-1]._z)
ui.sphere.show()
.....

class SphereWidgetDemo(QtWidgets.QMainWindow):

def __init__(self):
QtWidgets.QMainWindow.__init__(self)
widget = SphereWidget(self)
self.setCentralWidget(widget)

class SphereWidget(QGLWidget):
def __init__(self, parent):
QGLWidget.__init__(self, parent)
self.setMinimumSize(900, 900)

def paintGL(self):
global color_init
global x_init
global y_init
global z_init
quadObj = gluNewQuadric() #cоздаем новый объект для создания сфер и цилиндров
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
glLoadIdentity() #сброс просмотра
glPushMatrix()
for h in range(len(color_init)):
glTranslated(x_init[h]/100,y_init[h]/100,z_init[h]/100)
color = color_init[h]
glMaterialfv(GL_FRONT, GL_DIFFUSE, color)
gluQuadricDrawStyle(quadObj, GLU_FILL)
gluSphere(quadObj, 0.1, 40, 40)
glPopMatrix()
gluDeleteQuadric(quadObj)
glFlush()


def resizeGL(self, w, h):

glViewport(0, 0, w, h)
glMatrixMode(GL_PROJECTION)
x, y, width, height = glGetDoublev(GL_VIEWPORT)
gluPerspective(45.0, width / float(height or 1), 10, 350.0)
print('333')

def initializeGL(self):

glClear(GL_COLOR_BUFFER_BIT)
glEnable(GL_BLEND) # для эффекта наложения тел для получения эффекта прозрачности
glEnable(GL_ALPHA_TEST) # включение четвёртого компонента цвета
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) # функция, по которой будут смешиваться 2 цвета
glEnable(GL_DEPTH_TEST) # включаем буфер глубины
ambient = [1.0, 1.0, 1.0, 1]
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient)
glEnable(GL_LIGHTING)
lightZeroPosition = [-15, -20 , -30, 0.8]
lightZeroColor = [0.8, 1.0, 0.8, 1.0]
glLightfv(GL_LIGHT0, GL_POSITION, lightZeroPosition)
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.02)
glEnable(GL_LIGHT0)
pos = [-15, -20 , -30, 0.8]
pos1 = [-1, -1, -1]
glMatrixMode(GL_PROJECTION) # задание текущей матрицы GL_PROJECTION (проекции), т.е. той матрицы, на которую будут воздействовать последующие вызовы
# команд glLoadIdentity, glRotate, glTranslate, glMultMatrix
glLoadIdentity() # замена текущей матрицы (проекции) на единичную
x, y, width, height = glGetDoublev(GL_VIEWPORT)
gluPerspective(45, float(width) / float(height or 1), 10, 350.0) #умножение на перспективную матрицу
glMatrixMode(GL_MODELVIEW) #задание текущей матрицы преобразований
glLoadIdentity() # замена текущей матрицы (преобразований) на единичную
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.10.2018, 22:52
Ответы с готовыми решениями:

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

Про opengl и glfw. Где искать функции для загрузки 3д-обьектов и отрисовки текста?
Здрасти всем. Я вот не совсем понял кое что. Запустил пустое окно при помощи GLFW. И теперь ищу команды для загрузки 3д-файла (куб) и...

Задержка появления(отрисовки?) фрейма по Show
Добрый вечер. Есть форма ,на форме скролбокс . В конструкторе передаём форме фрейм,размещаем на скролбоксе. Почему при вызове Show форма...

5
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
28.10.2018, 09:33
Вставьте нормально код
0
0 / 0 / 0
Регистрация: 30.09.2018
Сообщений: 4
28.10.2018, 11:17  [ТС]
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
class SphereWidgetDemo(QtWidgets.QMainWindow):
 
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        widget = SphereWidget(self)
        self.setCentralWidget(widget)
 
class SphereWidget(QGLWidget): 
    def __init__(self, parent):
        QGLWidget.__init__(self, parent)
        self.setMinimumSize(900, 900)
 
    def paintGL(self):
        global color_init
        global x_init
        global y_init
        global z_init
        quadObj = gluNewQuadric()   #cоздаем новый объект для создания сфер и цилиндров                      
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
        glLoadIdentity() #сброс просмотра
        glPushMatrix()
        for h in range(len(color_init)):
            glTranslated(x_init[h]/100,y_init[h]/100,z_init[h]/100)
            color = color_init[h]
            glMaterialfv(GL_FRONT, GL_DIFFUSE, color)
            gluQuadricDrawStyle(quadObj, GLU_FILL)
            gluSphere(quadObj, 0.1, 40, 40)
        glPopMatrix() 
        gluDeleteQuadric(quadObj)
        glFlush()
 
 
    def resizeGL(self, w, h):
        
        glViewport(0, 0, w, h)
        glMatrixMode(GL_PROJECTION)
        x, y, width, height = glGetDoublev(GL_VIEWPORT)
        gluPerspective(45.0, width / float(height or 1), 10, 350.0)
        print('333')
    
    def initializeGL(self):
        
        glClear(GL_COLOR_BUFFER_BIT)
        glEnable(GL_BLEND) # для эффекта наложения тел для получения эффекта прозрачности
        glEnable(GL_ALPHA_TEST) # включение четвёртого компонента цвета
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) # функция, по которой будут смешиваться 2 цвета
        glEnable(GL_DEPTH_TEST) # включаем буфер глубины
        ambient = [1.0, 1.0, 1.0, 1]
        glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient)
        glEnable(GL_LIGHTING)
        lightZeroPosition = [-15, -20 , -30, 0.8]
        lightZeroColor = [0.8, 1.0, 0.8, 1.0]
        glLightfv(GL_LIGHT0, GL_POSITION, lightZeroPosition)
        glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.02)
        glEnable(GL_LIGHT0)
        glMatrixMode(GL_PROJECTION) # задание текущей матрицы GL_PROJECTION (проекции), т.е. той матрицы, на которую будут воздействовать последующие вызовы
        # команд glLoadIdentity, glRotate, glTranslate, glMultMatrix
        glLoadIdentity() # замена текущей матрицы (проекции) на единичную
        x, y, width, height = glGetDoublev(GL_VIEWPORT)
        gluPerspective(45, float(width) / float(height or 1), 10, 350.0) #умножение на перспективную матрицу
        glMatrixMode(GL_MODELVIEW) #задание текущей матрицы преобразований
        glLoadIdentity() # замена текущей матрицы (преобразований) на единичную
Python
1
2
3
4
5
6
7
if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.aboutToQuit.connect(app.deleteLater)
    window = QWidget()
    ui = uiBUKS.Ui_ProjectBUKS1()
    ui.setupUi(window)
    window.show()
непосредственно создание класса и вызов цикла отрисовки
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 ui.sphere = SphereWidgetDemo()
 while count <= num_of_iterations:
     global color_init
     color_init = []
     global x_init
     x_init = []
     global y_init
     y_init = []
     global z_init
     z_init = []      
     for l in range(len(s)):
        if count <= len(result_list[l]):
            x_init.append(result_list[l][count-1]._x)
            y_init.append(result_list[l][count-1]._y)
            z_init.append(result_list[l][count-1]._z)
      ui.sphere.show()
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
28.10.2018, 11:49
Функция show() отвечает за прорисовку окна и все, вызвать ее надо один раз, за перерисовку того что в окне отвечает функция render и расчеты нужно делать в ее начале
1
0 / 0 / 0
Регистрация: 30.09.2018
Сообщений: 4
28.10.2018, 14:14  [ТС]
Я не совсем понимаю следующий момент: в каком классе стоит определить функцию render(),с какими параметрами. Если в том же классе, что и paintGL(), то откуда вызывать эту функцию. Прежде, чем написать сюда, я попыталась найти пример использования функции для python, но мне не удалось это сделать. Я, правда, хочу разобраться в этом вопросе.
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,763
28.10.2018, 14:19
Цитата Сообщение от BUKSY Посмотреть сообщение
Прежде, чем написать сюда, я попыталась найти пример использования функции для python, но мне не удалось это сделать.
первая ссылка в яндексе
pyqt5 opengl example
https://github.com/baoboa/pyqt... les/opengl
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.10.2018, 14:19
Помогаю со студенческими работами здесь

Создание переменной внутри функции, при ее изменении внутри функции значение не меняется
Прошу объяснить, как работают глобальные переменные созданные внутри функции и ключи -Scpe -Option командлента Set-Variable. Моя...

Изменение последовательности внутри цикла for, мощность Си-шного for в python
Здравствуйте. Пишу калькулятор на python. Имеется список с операторами , которые я перебираю: for cur_op_num in range(len(opers)): ...

Странное поведение указателя на массив внутри функции
Можете мне объяснить, почему некорректно выполняется функция, а точнее строка 52? #include&lt;stdio.h&gt; void crc16(unsigned...

Не отрабатывает JQuery $('#b1').show("slow") внутри функции
Совсем новичок в Java. Пробую показать кнопки по клику на другую кнопку с помощью $('#b1').show(&quot;slow&quot;) Если просто скрипт...

Создание и инициализирование static переменной внутри цикла
Почему так? P.s. Я конкретно про переменную j внутри цикла. Почему она ведет себя по разному?


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru