Seite 1 von 1

DIB in Tkinter frame

Verfasst: Mittwoch 30. August 2006, 21:04
von PureImpact
Hallo Leute,

habe eine engine die ich aus Python mittels pywin32 scripte. Diese engine kann DIBs erzeugen. Wie kann man diese aber nun in Tkinter anzeigen?

Die Methode in der engine lautet:

---
Syntax
PlateDIB.PaintPicture(DeviceContext)

The method syntax has these parts:

Part Description
DeviceContext (Long) Handle to a GDI device context containing the destination bitmap (HDC, Long)
Return (Nothing) Does not return a value.

Remarks
Paints the bitmap in the PlateDIB object onto a bitmap in some other Windows Graphics Device Interface device. From Visual Basic, you can paint into a Picture control. For example, suppose you have a form with a Picture control on it named picImage, and a PlateDIB object that has been Create()ed and Render()ed named pdM104:

pdM104.PaintPicture picImage.handle
---

In Tkinter kenn ich sowas wie dies::

Code: Alles auswählen

left_frame.create_image(0, 0, anchor=NW, image=photo1)
Wie nun diese zwei Dinge verbinden? Wie krieg ich das DIB in photo1
bzw in mein frame?
D.h. was muss ich als Argument fuer die PaintPicture Methode uebergeben, damit das bitmap in Tkinter in dem frame auftaucht?

Vielleicht etwas bloed erklaert... ich hoffe ihr wisst was ich meine :wink:

Danke,
Reiner

Verfasst: Mittwoch 30. August 2006, 21:17
von Michael Schneider
Hi,

jetzt hab ich mal eine Anfängerfrage: was bedeutet DIB doch gleich :?: Und was genau hast Du und in welchem Format?

Grüße,
der Michel

Verfasst: Mittwoch 30. August 2006, 21:22
von PureImpact
Michael Schneider hat geschrieben:Hi,

jetzt hab ich mal eine Anfängerfrage: was bedeutet DIB doch gleich :?: Und was genau hast Du und in welchem Format?
l
Zitat:

---
A PlateDIB object contains a Windows device-independent bitmap (DIB) into which you can render the plate image. Once rendered, the DIB can be used to paint the image into any device context including Picture controls in Visual Basic, etc.
---

R.

Verfasst: Donnerstag 31. August 2006, 13:53
von PureImpact
Hallo nochmal,

hier mal ein code in VB der funktioniert. Er macht folgendes:
p ist ein Plate-Objekt von PinPoint (dies ist meine engine).
An diese Plate-Objekt haenge ich ein Bild im Format FITS ran.
Nun rufe ich ein paar Methoden auf, die nicht weiter interessieren.
Und zu guter letzt wird das dadurch entstandene Bild gemalt via
PaintPicture-Methode und zwar gleich in die PictureBoxPicture1 geschoben.

Meine Frage ist nun, wie kann man das ganze
in Tkinter auf den Bildschirm zaubern?

Was muss ich also beim Aufruf der PaintPicture-Methode als Argument
uebergeben, damit es in ein Tkinter frame(?) geht?

VB code:
---
Private Sub Command1_Click()

Set p = CreateObject("PinPoint.Plate")
p.AttachFITS "M:\Images\LaSagra\20060828\012128+170000-sagra21-S001-R001.fts"
Set m = p.NewPlateDIB()
m.Create 1, 1, 1, 1
m.Render 60000, 0
m.PaintPicture Picture1.hDC
p.DetachFITS

End Sub
---

Wenn ich etwa sowas wie m.PaintPicture(im) schreibe, so meint er:

---
Traceback (most recent call last):
File "L:\pin.py", line 91, in ?
m.PaintPicture(im)
File "<COMObject NewPlateDIB>", line 2, in PaintPicture
AttributeError: BitmapImage instance has no attribute '__int__'
---

Hier der wesentliche code in Python:

Code: Alles auswählen

p =win32com.client.dynamic.Dispatch('PinPoint.Plate')
p.AttachFITS('M:/Images/LaSagra/20060828/012128+170000-sagra21-S001-R001.fts')
m = p.NewPlateDIB()
m.Create(1, 1, 1, 1)
m.Render(60000, 0)
m.PaintPicture(im)
#Hier sind dann einige lines mit root = Tk() usw.
def expose(event):
    dib = ImageWin.Dib(im)
    dib.expose(ImageWin.HDC(left_frame.winfo_id()))

left_frame.bind("", expose)
p.DetachFITS()
Kann mir nicht vorstellen dass noch niemand vor diesem Problem gestanden hat :lol:

Gruesse,
Reiner

Verfasst: Donnerstag 31. August 2006, 18:08
von Michael Schneider
Hi,

mit der Python Image Library (PIL) kannst Du diverse Bildformate lesen und schreiben. FITS kann damit scheinbar genutzt werden, erfordert aber ein paar Verränkungen. Schau mal bei http://effbot.org/imagingbook/ unter FORMAT-FITS.

Ich schlage vor, Du versuchst das Bild in ein "gängigeres" Bildformat umzuwandeln, dann kann man das ohne Probleme auf vielen Widgets darstellen. Hier findest Du die unterstützten Bildformate: http://infohost.nmt.edu/tcc/help/pubs/pil/formats.html

Grüße,
Michael

Verfasst: Freitag 1. September 2006, 11:15
von PureImpact
Michael Schneider hat geschrieben:Ich schlage vor, Du versuchst das Bild in ein "gängigeres" Bildformat umzuwandeln, dann kann man das ohne Probleme auf vielen Widgets darstellen. Hier findest Du die unterstützten Bildformate: http://infohost.nmt.edu/tcc/help/pubs/pil/formats.html
Danke fuer den Voschlag, doch das ist keine Loesung in diesem Fall
da ich mit dem PlateDIB-Objekt arbeiten muss, weil ich noch andere
Methoden dessen benoetige fuer diese Bildauswertungssoftware.

Nochmal kurz. In VB klappt es mit folgendem code:

---
Private Sub Command1_Click()

Set p = CreateObject("PinPoint.Plate")
p.AttachFITS "M:\Images\LaSagra\20060828\012128+170000-sagra21-S001-R001.fts"
Set m = p.NewPlateDIB()
m.Create 1, 1, 1, 1
m.Render 60000, 0
m.PaintPicture Picture1.hDC
p.DetachFITS

End Sub
---

Ich haenge also ein FITS-Bild an das Plate object "p".
Ich definiere "m" als ein neues PlateDIB object von "p".
Ich erzeuge, und "rendere" das "m" und will es nun
mittels PaintPicture() in ein "Windows Graphics Device Interface device"
schieben. Das geht in VB einfach, indem ich als Argument den Namen
der PictureBox und deren Eigenschaft hDC uebergebe, also
m.PaintPicture Picture1.hDC

Das waere in Python sowas wie
m.PaintPicture(Picture1.hDC)

Nun habe ich in Python/Tkinter aber keine VB PictureBox.
Frage also: Was much ich als Argument uebergeben statt "Picture1.hDC"
damit es in einem Tkinter frame landet?

Mehr isses nicht :wink:

Habe es in Python so versucht, doch er steigt aus, weil "im" eben nicht
definiert ist:

Code: Alles auswählen

p = win32com.client.dynamic.Dispatch('PinPoint.Plate') 
p.AttachFITS('M:/Images/LaSagra/20060828/012128+170000-sagra21-S001-R001.fts') 
m = p.NewPlateDIB() 
m.Create(1, 1, 1, 1) 
m.Render(60000, 0) 
m.PaintPicture(im) 
#Here some Tkinter lines like root = Tk() etc.
def expose(event): 
    dib = ImageWin.Dib(im) 
    dib.expose(ImageWin.HDC(left_frame.winfo_id())) 

left_frame.bind("", expose) 
p.DetachFITS() 
---
Traceback (most recent call last):
File "L:\pin.py", line 91, in ?
m.PaintPicture(im)
NameError: name 'im' is not defined
---

Ich weiss wie man Bilder aus einem file in ein Tkinter frame bekommt,
nur in diesem Falle soll das von PaintPicture() gezeichnete DIB *direkt* in
ein Tkinter frame gehen. Das sollte die uebliche Vorgehensweise sein
wenn man eine GUI basierte Applikation hat.

Gruss,
Reiner

Verfasst: Freitag 1. September 2006, 12:25
von BlackJack
Ich würde mal behaupten das geht mit Tkinter nicht weil die API keine windowsspezifischen Fensterhandles kennt. Sollte man von einem plattformunabhängigen GUI Toolkit auch nicht unbedingt erwarten.

Du wirst also entweder ein anderes GUI Toolkit nehmen müssen, oder das Problem anders lösen. Zum Beispiel in ein PIL Image rendern und das dann anzeigen.

Verfasst: Freitag 1. September 2006, 12:48
von PureImpact
BlackJack hat geschrieben:Ich würde mal behaupten das geht mit Tkinter nicht weil die API keine windowsspezifischen Fensterhandles kennt. Sollte man von einem plattformunabhängigen GUI Toolkit auch nicht unbedingt erwarten.

Du wirst also entweder ein anderes GUI Toolkit nehmen müssen, oder das Problem anders lösen. Zum Beispiel in ein PIL Image rendern und das dann anzeigen.
Koennte es nicht mit ImageWin gehen?

---
The ImageWin Module


The ImageWin module contains support to create and display images on Windows.

ImageWin can be used with PythonWin and other user interface toolkits that provide access to Windows device contexts or window handles. For example, Tkinter makes the window handle available via the winfo_id method:

dib = ImageWin.Dib(...)

hwnd = ImageWin.HWND(widget.winfo_id())
dib.draw(hwnd, xy)
---

Wenn nein, wie kann ich das DIB in ein PIL image rendern?
Bzw. kann mir einer sagen, welches GUI Toolkit dafuer besser geeignet
waere?

R.

Verfasst: Freitag 1. September 2006, 13:45
von BlackJack
Das mit dem `ImageWin` Modul sieht doch vielversprechend aus. Schon ausprobiert?

Verfasst: Freitag 1. September 2006, 15:04
von PureImpact
BlackJack hat geschrieben:Das mit dem `ImageWin` Modul sieht doch vielversprechend aus. Schon ausprobiert?
Hmm, siehe oben in meinem Python code snippet :wink:
Kennt sich einer mit ImageWin aus und kann mir da mal auf die
Spruenge helfen? Das Modul scheint das zu koennen was benoetigt wird,
nur wie muss der code konkret lauten? :?:

R.

Verfasst: Montag 1. Januar 2007, 18:22
von Alexci
Problem geloest: http://www.python-forum.de/topic-8603.html

Nochmals danke an Gerold!

Mit freundlichen gruessen,
A.

Verfasst: Montag 26. Februar 2007, 21:19
von lordmyder
danke Gerold, genau das habe ich gesucht.
Nur noch eine Frage:
Wie kriege ich eine Tkinter Fenster-Handle?
Danke !!