温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - Using pyopengltk and add another common tkinter function
pyopengl python robotics tkinter

python - 使用pyopengltk并添加另一个常见的tkinter函数

发布于 2020-05-05 10:32:51

我目前尝试在tkinter中创建opengl仿真,因此找到了这个此处提供的示例代码:

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()

我可以很好地运行它,但是我一直感到困惑,因为我通常以这种格式使用tkinter:

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()

鉴于此,我是否可以使用pyopengltk插入普通的tkinter项目,例如框架,按钮等?

查看更多

提问者
Albert H M
被浏览
116
community wiki 2020-02-17 21:59

基于@stovfl建议的解决方案,我们只需要将opengl类插入到tkinter类中即可__init__然后变成:

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()