Hi all,
I have a problem for which I wasn't able to find an answer anywhere else, maybe someone can give me a hint...
I designed with XRCed a small GUI (the code is at the bottom of the message) made up of a menu and a frame in which there are two panels, placed by an horizontal sizer.
Now, what I would like to do is to be able to load an image and display it on the left panel, automatically resizing the panel depending on the image size (the code is at the end again). There are actually two problems:
1) if I load an image the panel is not resized automatically
2) if I resize the panel manually after having loaded the image, the DC is not repainted. that is, the portion of the image which was invisible is not painted
Is there anyone with a bit of time to explain me how to solve these problems?
thanks, qrz
------------------ XRC ----------------------------
<?xml version="1.0" ?>
<resource>
<object class="wxFrame" name="MAIN">
<title>test</title>
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<object class="wxPanel" name="IMAGE">
<size>100,100</size>
</object>
<border>5</border>
</object>
<object class="sizeritem">
<object class="wxPanel" name="CONTROLS">
<size>100,100</size>
</object>
<border>5</border>
</object>
</object>
</object>
<object class="wxMenuBar" name="MENU">
<object class="wxMenu" name="MENU_FILE">
<label>File</label>
<object class="wxMenuItem" name="MENU_FILE_OPEN">
<label>Open</label>
</object>
</object>
</object>
</resource>
---------------- PYTHON -----------------------------
from wxPython.wx import *
from wxPython.xrc import *
import Image
def pilToWx(pil):
image = wxEmptyImage(pil.size[0], pil.size[1])
image.SetData(pil.convert('RGB').tostring())
return image
class MyApp(wxApp):
def OnInit(self):
self.res = wxXmlResource("test.xrc")
self.InitFrame()
self.InitMenu()
self.InitEverythingElse()
self.image = None
return True
def InitFrame(self):
self.frame = self.res.LoadFrame(None, "MAIN")
self.ipanel = XRCCTRL(self.frame, "IMAGE")
EVT_PAINT(self.ipanel, self.OnPaint)
self.cpanel = XRCCTRL(self.frame, "CONTROLS")
def InitMenu(self):
self.menuBar = self.res.LoadMenuBar("MENU")
EVT_MENU(self.frame, XRCID("MENU_FILE_OPEN"), self.Open)
self.frame.SetMenuBar(self.menuBar)
def InitEverythingElse(self):
self.sizer = self.frame.GetSizer()
self.frame.SetAutoLayout(True)
self.sizer.Fit(self.frame)
self.sizer.SetSizeHints(self.frame)
self.frame.Show(1)
self.SetTopWindow(self.frame)
def Open(self, evt):
fd = wxFileDialog(self.frame, "Open image", "", "", \
"PNG image (*.png)|*.png|JPEG image (*.jpg)|*.jpg", \
wxOPEN)
if fd.ShowModal() == wxID_OK:
im = Image.open(fd.GetPath())
self.image = pilToWx(im)
self.ipanel.SetSize(im.size)
self.ipanel.Refresh(True)
fd.Destroy()
def OnPaint(self, evt):
if self.image:
dc = wxPaintDC(self.ipanel)
dc.DrawBitmap(self.image.ConvertToBitmap(), 0,0)
def main():
app = MyApp(0)
app.MainLoop()
if __name__ == '__main__':
main()