DIB in Tkinter frame

Fragen zu Tkinter.
Antworten
PureImpact
User
Beiträge: 15
Registriert: Donnerstag 13. April 2006, 19:20

Mittwoch 30. August 2006, 21:04

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
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Mittwoch 30. August 2006, 21:17

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
PureImpact
User
Beiträge: 15
Registriert: Donnerstag 13. April 2006, 19:20

Mittwoch 30. August 2006, 21:22

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.
PureImpact
User
Beiträge: 15
Registriert: Donnerstag 13. April 2006, 19:20

Donnerstag 31. August 2006, 13:53

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
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Donnerstag 31. August 2006, 18:08

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
PureImpact
User
Beiträge: 15
Registriert: Donnerstag 13. April 2006, 19:20

Freitag 1. September 2006, 11:15

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
BlackJack

Freitag 1. September 2006, 12:25

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.
PureImpact
User
Beiträge: 15
Registriert: Donnerstag 13. April 2006, 19:20

Freitag 1. September 2006, 12:48

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.
BlackJack

Freitag 1. September 2006, 13:45

Das mit dem `ImageWin` Modul sieht doch vielversprechend aus. Schon ausprobiert?
PureImpact
User
Beiträge: 15
Registriert: Donnerstag 13. April 2006, 19:20

Freitag 1. September 2006, 15:04

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.
Alexci
User
Beiträge: 44
Registriert: Dienstag 18. April 2006, 23:08

Montag 1. Januar 2007, 18:22

Problem geloest: http://www.python-forum.de/topic-8603.html

Nochmals danke an Gerold!

Mit freundlichen gruessen,
A.
lordmyder

Montag 26. Februar 2007, 21:19

danke Gerold, genau das habe ich gesucht.
Nur noch eine Frage:
Wie kriege ich eine Tkinter Fenster-Handle?
Danke !!
Antworten