[wxPython] how to automatically resize a window?

Discussion in 'Python' started by Curzio Basso, Apr 21, 2004.

  1. Curzio Basso

    Curzio Basso Guest

    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()
     
    Curzio Basso, Apr 21, 2004
    #1
    1. Advertising

  2. Curzio Basso

    David Fraser Guest

    Curzio Basso wrote:
    >
    > 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


    You probably want to go to the wxPython users mailing list for this (see
    the links on the wxpython home page)

    David
     
    David Fraser, Apr 22, 2004
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. =?Utf-8?B?U2lsZWVzaA==?=
    Replies:
    4
    Views:
    33,917
    =?Utf-8?B?U29sZWwgU29mdHdhcmU=?=
    Oct 14, 2004
  2. Anand
    Replies:
    1
    Views:
    357
    Cliff Wells
    Jul 23, 2003
  3. Leo Lee
    Replies:
    3
    Views:
    393
    Leo Lee
    Jul 17, 2008
  4. Replies:
    2
    Views:
    1,266
    Adrienne
    Feb 13, 2005
  5. DL
    Replies:
    1
    Views:
    122
    Thomas 'PointedEars' Lahn
    Dec 10, 2009
Loading...

Share This Page