|
5 | 5 |
|
6 | 6 | Example for how to have a bitmap autosize itself in wxPython |
7 | 7 | """ |
8 | | - |
| 8 | +import math |
9 | 9 | import wx |
10 | | -print "using wxPython version:", wx.__version__ |
| 10 | + |
| 11 | +KEEP_ASPECT_RATIO = True |
| 12 | + |
| 13 | + |
| 14 | +class AutoSizeFrame(wx.Frame): |
| 15 | + def __init__(self, image, *args, **kwargs): |
| 16 | + wx.Frame.__init__(self, *args, **kwargs) |
| 17 | + |
| 18 | + self.aspect_ratio = float(image.Width) / float(image.Height) |
| 19 | + self.canvas = AutoSizeBitmap(image, self) |
| 20 | + self.canvas.SetSize((300, 400)) |
| 21 | + |
| 22 | + self.Bind(wx.EVT_SIZE, self.OnSize) |
| 23 | + |
| 24 | + self.Fit() |
| 25 | + self.Show() |
| 26 | + |
| 27 | + def OnSize(self, evt=None): |
| 28 | + size = self.Size |
| 29 | + if (size[0] > 0 and size[1] > 0): |
| 30 | + width, height = size |
| 31 | + if KEEP_ASPECT_RATIO: |
| 32 | + total_size = width * height |
| 33 | + height = int(math.sqrt(total_size / self.aspect_ratio)) |
| 34 | + width = int(total_size / height) |
| 35 | + # resize window on the fly to keep the aspect ratio |
| 36 | + self.SetSize((width, height)) |
| 37 | + self.canvas.SetSize((width, height)) |
| 38 | + |
11 | 39 |
|
12 | 40 | class AutoSizeBitmap(wx.Window): |
13 | 41 | """ |
14 | 42 | A subclass of wx.Window that will hold an image (much like a StaticBitmap), |
15 | 43 | but re-size it to fit the current size of the Window |
16 | | -" """ |
17 | | - def __init__(self, parent, image, *args, **kwargs): |
| 44 | + """ |
| 45 | + def __init__(self, image, *args, **kwargs): |
18 | 46 | """ |
19 | 47 | initialize an AutoSizeBitmap |
20 | | - |
| 48 | +
|
21 | 49 | :param parent: parent Window for this window |
22 | 50 | :param image: a wx.Image that you want to display |
23 | | - """ |
24 | | - wx.Window.__init__(self, parent, *args, **kwargs) |
| 51 | + """ |
| 52 | + wx.Window.__init__(self, *args, **kwargs) |
25 | 53 |
|
26 | 54 | self.orig_image = image |
27 | 55 | self.bitmap = None |
28 | | - |
| 56 | + self.prev_size = self.Size |
| 57 | + |
29 | 58 | self.Bind(wx.EVT_SIZE, self.OnSize) |
30 | 59 | self.Bind(wx.EVT_PAINT, self.OnPaint) |
31 | 60 |
|
32 | 61 | def OnSize(self, evt=None): |
33 | | - img = self.orig_image.Copy() |
34 | | - img.Rescale(*self.Size) |
35 | | - self.bitmap = wx.BitmapFromImage(img) |
36 | | - self.Refresh() |
| 62 | + size = self.Size |
| 63 | + if size[0] > 0 and size[1] > 0: |
| 64 | + img = self.orig_image.Copy() |
| 65 | + img.Rescale(*size) |
| 66 | + self.bitmap = wx.BitmapFromImage(img) |
| 67 | + self.Refresh() |
37 | 68 |
|
38 | 69 | def OnPaint(self, evt=None): |
39 | 70 | dc = wx.PaintDC(self) |
40 | 71 | try: |
41 | | - dc.DrawBitmap(self.bitmap,0,0) |
42 | | - except ValueError: # in case bitmap has not yet been initialized |
| 72 | + dc.DrawBitmap(self.bitmap, 0, 0) |
| 73 | + except ValueError: # in case bitmap has not yet been initialized |
43 | 74 | pass |
44 | 75 |
|
45 | 76 | if __name__ == "__main__": |
46 | 77 | import sys |
47 | | - |
48 | | - try: |
| 78 | + |
| 79 | + try: |
49 | 80 | filename = sys.argv[1] |
50 | 81 | except: |
51 | 82 | filename = "Images/cute_close_up.jpg" |
52 | 83 | App = wx.App(False) |
53 | | - f = wx.Frame(None) |
54 | 84 | img = wx.Image(filename) |
55 | | - b = AutoSizeBitmap(f, img) |
56 | | - f.Show() |
| 85 | + f = AutoSizeFrame(img, None, size=(400, 600)) |
57 | 86 | App.MainLoop() |
58 | 87 |
|
0 commit comments