picImage.handle in Python

Fragen zu Tkinter.
Antworten
Alexci
User
Beiträge: 44
Registriert: Dienstag 18. April 2006, 23:08

Sonntag 31. Dezember 2006, 01:24

Hi,

I have a simple question. How to create a form with a Picture control in Python?

In Visual Basic it is easy. Here the VB code:

Code: Alles auswählen

Private Sub Command1_Click()
    Set p = CreateObject("PinPoint.Plate")
    p.AttachFITS "E:\test.fts"
    
    Set m = p.NewPlateDIB()
    m.Create 1, 1, 1, 1
    m.Render 3600, 2700
    m.PaintPicture Picture1.hDC
    p.DetachFITS
End Sub
I need to create a PictureBox (Picture1.hDC) in python.

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


Thank You!


Best regards,
Aleksandar
Alexci
User
Beiträge: 44
Registriert: Dienstag 18. April 2006, 23:08

Sonntag 31. Dezember 2006, 15:03

Ich habe es mit win32ui versucht aber es funktioniert nicht :(

Code: Alles auswählen

p =win32com.client.dynamic.Dispatch('PinPoint.Plate')
p.AttachFITS ('test.fts')
m = p.NewPlateDIB()
m.Create(1, 1, 1, 1)
m.Render(7600, 4000)

hDC = win32ui.CreateDC ()
m.PaintPicture(hDC)
http://aspn.activestate.com/ASPN/docs/A ... _meth.html


Gruesse,
Aleksandar
Alexci
User
Beiträge: 44
Registriert: Dienstag 18. April 2006, 23:08

Sonntag 31. Dezember 2006, 19:05

Hallo,

vielleicht geht es mit Hilfe von wx.MemoryDC() oder wx.BufferedDC(), ich kenne mich aber damit nicht aus.
Bitte um Hilfe!

Code: Alles auswählen

offDC = wx.MemoryDC()
#wx.BufferedDC()
m.PaintPicture(offDC)

Error nachricht:

Traceback (most recent call last):
File "E:\showimage.py", line 125, in -toplevel-
offDC = wx.MemoryDC()
File "C:\Program Files\Python24\lib\site-packages\wx-2.7.2-msw-ansi\wx\_gdi.py", line 4753, in __init__
_gdi_.MemoryDC_swiginit(self,_gdi_.new_MemoryDC(*args, **kwargs))
PyNoAppError: The wx.App object must be created first!



Danke!


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

Sonntag 31. Dezember 2006, 20:21

Alexci hat geschrieben:vielleicht geht es mit Hilfe von wx.MemoryDC() oder wx.BufferedDC(), ich kenne mich aber damit nicht aus.
Hi Aleksandar!


In diesem Beispiel wird ein Quadrat gezeichnet.

Code: Alles auswählen

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

import wx

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


class MyFrame(wx.Frame):
    
    def __init__(self, parent = None, id = -1, title = "Rounded Rectangle"):
        
        wx.Frame.__init__(self, parent, id, title)
        
        panel = wx.Panel(self, size = (200, 200))
        self.panel = panel
        panel.Bind(wx.EVT_PAINT, self.on_panel_paint)
        
        panel.Fit()
        self.Fit()
        self.SetSizeHintsSz(self.GetSizeTuple())
    

    def on_panel_paint(self, event):
        dc = wx.PaintDC(self.panel)
        
        print dc.GetHDC() # Das könnte evt. ein Einstiegspunkt für dich sein.
        
        rect = wx.Rect(50, 50, 100, 100)
        dc.DrawRoundedRectangleRect(rect, 8)


def main():
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main() 


Falls der bereits von dir geschriebene Code prinzipiell funktioniert, dann könnte die on_panel_paint-Methode so abgeändert werden:

Code: Alles auswählen

    def on_panel_paint(self, event):
        dc = wx.PaintDC(self.panel)
        
        hdc = dc.GetHDC()
        
        p = win32com.client.dynamic.Dispatch('PinPoint.Plate')
        p.AttachFITS('test.fts')
        m = p.NewPlateDIB()
        m.Create(1, 1, 1, 1)
        m.Render(7600, 4000)
        
        m.PaintPicture(hdc)
Wenn es so funktioniert, dann kannst du die Sache mit ``wx.BufferedDC()`` und Co. beschleunigen, denn mit dieser Methode wird derzeit bei jedem Paint-Ereignis alles komplett neu berechnet und neu gezeichnet. Aber zumindest findest du so schon mal raus, ob du mit wxPython weiter kommst.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Alexci
User
Beiträge: 44
Registriert: Dienstag 18. April 2006, 23:08

Montag 1. Januar 2007, 05:17

Es funktioniert! Vielen DANK und ein frohes neues Jahr!


A.
Antworten