Openglfenster in Tkinter einbinden.

Fragen zu Tkinter.
Antworten
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Hallo, wie kann ich ein Openglfenster in Tkinter einsetzen , welches dann nur ein Teil vom Tkinterfenster ist und ich zb rechts daneben Butten setzen kann?

Gruss
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Dafür gibt es zB Togl http://togl.sourceforge.net/index.html

Hier noch die API-Dokumentation: http://pyopengl.sourceforge.net/pydoc/OpenGL.Tk.html

Edit: Befindet sich schon im site-package von PyOpenGL
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Jup, danke, ist schon eine Hilfe.

Ich suche mal ein winziges Beispiel dafür.

Gruss
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

zB so:

Code: Alles auswählen

from OpenGL.GL import *
import OpenGL.Tk as togl
import Tkinter as tkinter
import time

class ColorBox(togl.Opengl):
    """A colorful, rotating box"""

    def __init__(self, master, cnf=()):
        """Initialize GUI and OpenGL"""
        togl.Opengl.__init__(self, master, **cnf)

        self.set_eyepoint(20) # move away from object

        #total degrees of rotation
        self.amountRotated = 0

        #rotate amount in degrees
        self.increment = 2

    def redraw(self, event):
        """Draw box on black background"""

        #clear background and disable lighting
        glClearColor(0.0, 0.0, 0.0, 0.0) #set clearing color
        glClear(GL_COLOR_BUFFER_BIT) #clear background
        glDisable(GL_LIGHTING)

        #constants
        red = (1.0, 0.0, 0.0)
        green = (0.0, 1.0, 0.0)
        blue = (0.0, 0.0, 1.0)
        purple = (1.0, 0.0, 1.0)

        vertices =\
            [((-3.0, 3.0, -3.0), red),
            ((-3.0, -3.0, -3.0), green),
            (( 3.0, 3.0, -3.0), blue),
            (( 3.0, -3.0, -3.0), purple),
            (( 3.0, 3.0, 3.0), red),
            (( 3.0, -3.0, 3.0), green),
            ((-3.0, 3.0, 3.0), blue),
            ((-3.0, -3.0, 3.0), purple),
            ((-3.0, 3.0, -3.0), red),
            ((-3.0, -3.0, -3.0), green)]

        #begin drawing
        glBegin(GL_QUAD_STRIP) 

        #change color and plot point for each vertex
        for vertex in vertices:
            location, color = vertex
            apply(glColor3f, color)
            apply(glVertex3f, location)

        #stop drawing
        glEnd() 

    def update(self):
        """Rotate box"""
        
        #change rotation direction
        if self.amountRotated >= 500:
            self.increment = -2 #rotate left
            
        #change rotation direction
        elif self.amountRotated <= 0: 
            self.increment = 2 #rotate right

        #rotate box around x, y, z axis (1.0, 1.0, 1.0)
        glRotate(self.increment, 1.0, 1.0, 1.0)
        self.amountRotated += self.increment
        
        #redraw geometry
        self.tkRedraw()


if __name__ == "__main__":

    # Da beim ersten import von OpenGl.Tk ein Tk Fenster gebaut wird zerstoere
    # ich dieses hier, da es fuer mich keinen ersichtlichen nutzen hat.
    try:
        togl._default_root.destroy()
    except tkinter.TclError:
        pass
    
    root = tkinter.Tk()
    root.tk.call('package', 'require', 'Togl')
    
    frame_left = tkinter.Frame(root)
    frame_left.pack(side="left")
    
    bt = tkinter.Button(frame_left, text="Do something!")
    bt.pack()
    
    cb = ColorBox(root, dict(double=1))
    cb.pack(expand="yes", fill="both")

    while True:
        time.sleep(0.025)
        cb.update()
        root.update()

    root.mainloop()
Habe die OpenGL-Klasse von hier http://community.activestate.com/forum/ ... ckage-togl übernommen und in einen Funktionierenden Context gesetzt.

Edit: Den Code nochmal etwas verbessert.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

import OpenGL.Tk as togl

Ich habe Windows, da kommt die Fehlermeldung, das ich das nicht drauf habe.
Gibt es da etwas für python 2.6.6 für Windows?

Gruss
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Du musst togl erst der Tcl Bibliothek hinzufügen und in die OpenGL Bibliothek Sachgerecht installieren und nicht einfach die exe drauf schmeißen steht aber alles auf der Installations Seite der oben genannten Links.

togl gehöhrt nicht zur Standardbibliothek des PyOpenGL Paketes, sondern als deprecated eingetragen wurde
und es kann durch aus sein das dies in der .exe nicht gemacht wurde.

Es stellt nur die Tk-Klassen für die Verwendung verfügbar.
Also, mit anderen Worten downloade dir die PyOpenGL zip oder tar.gz - entpacke diese und installier das ganze über die Kommandozeile: "python setup.py install".
Dann gehe in den src-Ordner von PyOpenGL und führe den Script togl.py aus.

Und nochmal - das steht alles in der Installationsbeschreibung
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Jup, danke. funktioniert jetzt.

Gruss
Antworten