J'essaie actuellement de créer une simulation opengl dans tkinter, j'ai donc trouvé ceci. L'exemple de code fourni ici :

import time
import tkinter
from OpenGL import GL
from pyopengltk import OpenGLFrame

class AppOgl(OpenGLFrame):

    def initgl(self):
        """Initalize gl states when the frame is created"""
        GL.glViewport(0, 0, self.width, self.height)
        GL.glClearColor(0.0, 1.0, 0.0, 0.0)    
        self.start = time.time()
        self.nframes = 0

    def redraw(self):
        """Render a single frame"""
        GL.glClear(GL.GL_COLOR_BUFFER_BIT)
        tm = time.time() - self.start
        self.nframes += 1
        print("fps",self.nframes / tm, end="\r" )


if __name__ == '__main__':
    root = tkinter.Tk()
    app = AppOgl(root, width=320, height=200)
    app.pack(fill=tkinter.BOTH, expand=tkinter.YES)
    app.animate = 1
    app.after(100, app.printContext)
    app.mainloop()

Je peux l'exécuter correctement mais je suis un peu confus car j'utilise généralement tkinter avec ce format :

class frontpage(tk.Tk):
    def __init__(self,parent):
        tk.Tk.__init__(self,parent)
        self.parent=parent

        '''Creating'''
        #Window 1
        label1 = tk.Label(self, text = 'App title',bg='blue',fg='white')
        frame1 = tk.Frame(self)

        ''' Some code '''

        label1.pack(fill='x')
        frame1.pack()

    def func1(self):
        #some function

if __name__ == '__main__':
    frontapp = frontpage(None)
    frontapp.title('App v0.1')
    frontapp.mainloop()

Compte tenu de cela, est-il possible d'insérer un élément tkinter normal tel qu'un cadre, un bouton, etc. en utilisant pyopengltk?

0
Albert H M 17 févr. 2020 à 15:10

1 réponse

Meilleure réponse

Sur la base de la solution suggérée par @stovfl, nous avons juste besoin d'insérer notre classe opengl dans notre classe tkinter __init__. Il devient alors :

from __future__ import print_function

import sys, math, time
import tkinter as tk
from OpenGL import GL, GLU
from pyopengltk import OpenGLFrame

class AppOgl(OpenGLFrame):

    def initgl(self):
        """Initalize gl states when the frame is created"""
        GL.glViewport(0, 0, self.width, self.height)
        GL.glClearColor(0.0, 1.0, 0.0, 0.0)    
        self.start = time.time()
        self.nframes = 0

    def redraw(self):
        """Render a single frame"""
        GL.glClear(GL.GL_COLOR_BUFFER_BIT)
        tm = time.time() - self.start
        self.nframes += 1
        print("fps",self.nframes / tm, end="\r" )

class frontpage(tk.Tk):
    def __init__(self,parent):
        tk.Tk.__init__(self,parent)
        self.parent=parent

        open_gl_frame = AppOgl(self, width=320, height=200)
        '''Creating'''
        #Window 1
        label1 = tk.Label(self, text = 'App title',bg='blue',fg='white')
        frame1 = tk.Frame(self)

        ''' Some code '''

        open_gl_frame.animate=1 #dont forget this, or your simulation would not animated
        open_gl_frame.pack()
        label1.pack(fill='x')
        frame1.pack()

    def func1(self):
        pass

if __name__ == '__main__':
        frontapp = frontpage(None)
        frontapp.title('App v0.1')
        frontapp.mainloop()
0
Albert H M 17 févr. 2020 à 13:59