Seite 1 von 1
picImage.handle in Python
Verfasst: Sonntag 31. Dezember 2006, 01:24
von Alexci
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
Verfasst: Sonntag 31. Dezember 2006, 15:03
von Alexci
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
Verfasst: Sonntag 31. Dezember 2006, 19:05
von Alexci
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
Verfasst: Sonntag 31. Dezember 2006, 20:21
von gerold
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
Verfasst: Montag 1. Januar 2007, 05:17
von Alexci
Es funktioniert! Vielen DANK und ein frohes neues Jahr!
A.