[Nicht gelöst] Frage zu wx.ogl

Plattformunabhängige GUIs mit wxWidgets.
Antworten
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi.

Hab mir in der Demo zu wxPython unter Miscellaneous/OGL das Beispiel angesehen und die Doku zu wx.ogl überfolgen und frage mich jetzt ob es eine Möglichkeit gibt das ganze Angezeigt auch als Bild zu speichern? So weit ich sehen bietet die Lib da kein Funktion. Gibt es andere Möglichkeiten den Fensterinhalt abzufangen (auch den nicht sichtbaren) und das dann zu Speichern?

lg
Zuletzt geändert von sape am Samstag 27. Januar 2007, 18:21, insgesamt 1-mal geändert.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Mal ein anderer Ansatz: Kann man nicht eventuell von dem ganzen (sowohl das was man sieht und das was man nicht sieht weil das Fenster eventuell zu Klein ist und man dan zum Bereich scrollen muss) Fensterbereich mit einem Modul ein Screenshot machen? Ich denke mit http://www.pythonware.com/products/pil/ wir das gehen (werde ich Morgen ausprobieren), aber ist das wirklich sauber die Lösung :? Was mein ihr?

lg
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

PIL kann ich schon mal vergessen ^^ -> http://www.pythonware.com/library/pil/h ... gegrab.htm
The ImageGrab module can be used to copy the contents of the screen or the clipboard to a PIL image memory.

The current version works on Windows only.
Sollte schon unter Win und Linux laufen :D

Ich halte mal ausschau nach was anderem. Wenn ich nichts finde steige ich eventuell auf PyGTK um, da es da sowas anscheinend gibt (Dia 0.95 ist ja auch in GTK geschrieben und da geht es ja auch ^^).

EDIT: Text Korrigiert.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

sape hat geschrieben:Gibt es andere Möglichkeiten den Fensterinhalt abzufangen (auch den nicht sichtbaren) und das dann zu Speichern?
Hi sape!

Ich weiß, wie du den sichtbaren Fensterinhalt speichern kannst. Aber ich weiß nicht, wie du den unsichtbaren Fensterinhalt speichern kannst. :K

Ich hab mich da mal ein bischen gespielt. Das Modul ``images.py`` holst du dir von deinem wxPython-Demo-Ordner.

http://paste.pocoo.org/show/aacacdafe67 ... af2b78fd6/

Das müsstest du bei der wxPython-Mailingliste erfragen, denn ich kann mir nicht vorstellen, dass es keine Möglichkeit gibt. :D

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Vielen, vielen dank Gerold :) Werde das Beispiel morgen testen.

lg
sape
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi, Gerold. Hab das getestet und Funktioniert wunderbar. Allerdings hatte ich erst ein par Probleme:

Code: Alles auswählen

    newobj = _gdi_.new_MemoryDC(*args, **kwargs)
TypeError: new_MemoryDC() takes exactly 0 arguments (1 given)
Das lag daran.

Code: Alles auswählen

dc2 = wx.MemoryDC(bmp)
Aber mit ``.SelectObject`` geht das

Code: Alles auswählen

dc2 = wx.MemoryDC()
dc2.SelectObject(bmp)
Hier der replay: http://paste.pocoo.org/show/1c33017928f ... b01b4dd74/

Und hier das diff: http://paste.pocoo.org/compare/1c330179 ... b01b4dd74/

Ich erwähne das nur der Vollständigkeitshalber falls ein andere auf den Thread stößt und sich dann über den Traceback wundert.

BTW: Das mit den resizen des Fenster, damit auch der nicht sichtbare Bereich erfast wird ist sehr raffiniert 8)

Nochmals vielen Dank :)

lg
sape
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Kleine Frage am Rande: Warum definiert ihr im LodgeIt die Pastes als Privat, wenn ihr sie sowieso hier postet? Wenn sie "Publik" sind, erscheinen sie auch im Listing was ich ganz nett finde, auch für den Fall dass es irgendwann mal eine Suchfunktion geben würde.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

sape hat geschrieben:[...]
BTW: Das mit den resizen des Fenster, damit auch der nicht sichtbare Bereich erfast wird ist sehr raffiniert 8)
Puh, hab noch ein wenig getestet und ganz so Funktioniert das doch nicht. Es wird doch nicht alles erfast. Bleibt also immer noch das Problem wie man den ganzen Inhalt vom ``ogl.ShapeCanvas`` als Bitmap speichern kann :? In dieser Beziehung ist wx doch nicht so "Benutzerfreundlich".

Eine Deutsch Mailing Liste zu wxPython gibt es nicht oder? Hab schon alles abgesucht auf der HP.

BTW: Hab eben auch zu ``ogl.ShapeCanvas`` das ganze Web durchsucht und nichts dazu passende gefunden. Kann doch nicht sein das ich der einzige bin der sowas braucht ^^

Leo, kA. Ich stelle meine Pastes nie privat rein, es sei wenn ich ein replay mache wo das Original auch schon Privat ist.

lg und ne gn8
sape
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Leonidas hat geschrieben:Warum definiert ihr im LodgeIt die Pastes als Privat, wenn ihr sie sowieso hier postet?
Hi Leonidas!

Ich habe das Codebeispiel als "Privat" deklariert, damit es NICHT in irgendeiner Liste auftaucht. Das Beispiel funktioniert nicht korrekt. Es gibt also keinen Grund es übermäßig zu publizieren. Ich wollte es so! Also bitte nicht mit dem Zeigefinger rumfuchteln.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Sape!
sape hat geschrieben:hab noch ein wenig getestet und ganz so Funktioniert das doch nicht.
Ein Fenster lässt sich maximal bis zur Screen-Size vergrößern. Es gibt ein Flackern und ich würde es mal als "Nicht Saubere Programmierung" hinstellen. Deshalb brauchst du die Hilfe der wxPython-Mailingliste. Dort sind die wxPython-Entwickler und Profis zu hause.
sape hat geschrieben:Eine Deutsch Mailing Liste zu wxPython gibt es nicht oder?
Nur eine englische... eine andere Chance hast du nicht. Ich kann kaum Englisch, deshalb musst du die Frage selber stellen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

gerold hat geschrieben:Ich habe das Codebeispiel als "Privat" deklariert, damit es NICHT in irgendeiner Liste auftaucht. Das Beispiel funktioniert nicht korrekt. Es gibt also keinen Grund es übermäßig zu publizieren. Ich wollte es so! Also bitte nicht mit dem Zeigefinger rumfuchteln.
Hast mich falsch verstanden - ich wollte gar nicht mit dem Zeigefinger rumfuchteln, sondern nur wissen, welchen Sinn das hat. Also nichts für ungut.

(Und dass im LodgeIt reihenweise kaputte Codes sind, ist noch etwas ganz anderes 8))
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hier ist ein etwas kürzeres Beispiel -- allerdings ist das Problem damit noch nicht gelöst.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx
import wx.lib.ogl as ogl

wx.SetDefaultPyEncoding("iso-8859-1")


class AppFrame(wx.Frame):
    def __init__(self):
        
        wx.Frame.__init__(self, None, -1, "Demo", size=(300,200))
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(vbox)
        
        sw = wx.ScrolledWindow(self)
        sw.SetScrollbars(50, 40, 10, 100)
        vbox.Add(sw, 1, wx.EXPAND)
        
        canvas = ogl.ShapeCanvas(sw, size = wx.Size(500, 400))
        canvas.SetSizeHints(500, 400)
        self.canvas = canvas
        
        sw.SetVirtualSize(canvas.GetSize())
        
        canvas.SetBackgroundColour("LIGHT BLUE")
        
        diagram = ogl.Diagram()
        canvas.SetDiagram(diagram)
        diagram.SetCanvas(canvas)
        shape = ogl.CircleShape(20.0)
        shape.SetX(25.0)
        shape.SetY(25.0)
        canvas.AddShape(shape)
        diagram.ShowAll(True)
        
        cmd = wx.Button(self, -1, "Speichern")
        vbox.Add(cmd, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 5)
        cmd.Bind(wx.EVT_BUTTON, self.save_image)        
        
        # apply sizer
        self.Show()


    def save_image(self, event = None):
        print "save..."
        canvas = self.canvas
        
        import os
        if os.path.isfile("aaa.bmp"):
            os.remove("aaa.bmp")
        
        dc = wx.ClientDC(canvas)
        #dc = wx.ClientDC(self)
        
        w, h = dc.GetSizeTuple()
        
        
        #print "Handle:", canvas.GetHandle()
        #print dc.GetHDC()
        
        print w, h
        
        bmp = wx.EmptyBitmap(w, h)
        dc2 = wx.MemoryDC(bmp)
        
        #old_size = self.GetSize()
        #self.SetSize(wx.Size(w + 200, h + 200))
        
        #wx.Yield()
        
        dc2.Blit(0, 0, w, h, dc, 0, 0)
        
        #self.SetSize(old_size)
        
        bmp.SaveFile("aaa.bmp", wx.BITMAP_TYPE_BMP)
        
        #test_window.bmp.SaveFile("aaa.bmp", wx.BITMAP_TYPE_BMP)


def main():
    app = wx.PySimpleApp()
    ogl.OGLInitialize()
    frame = AppFrame()
    app.MainLoop()
    app.Destroy()


if __name__ == "__main__":
    main()
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

gerold hat geschrieben:
sape hat geschrieben:Eine Deutsch Mailing Liste zu wxPython gibt es nicht oder?
Nur eine englische... eine andere Chance hast du nicht. Ich kann kaum Englisch, deshalb musst du die Frage selber stellen.
Ich kann auch leider kaum englisch (Eigentlich garnicht.) :/ Aber ich werde es trotzdem mal probieren und nächste Woche in der Mailingliste nachfragen und dann das Ergebnis hier posten.

lg
sape
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hier ist ein etwas kürzeres Beispiel -- allerdings ist das Problem damit noch nicht gelöst.
Thx, ist schön gekürzt und werde ich dann für meine Frage verwenden :)

lg
sape
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Wie versprochen das Feedback. Habs nicht gelöst gekriegt.

lg
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Um den Thread wieder zu beleben:
http://lists.wxwidgets.org/cgi-bin/ezml ... dphbmaghdh

Vielleicht findet man dort etwas brauchbares.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi Gerold, danke dir für den Link. Ich werde bei Gelegenheit sm/uml.py studieren.

lg
Antworten