簡體   English   中英

當 sizer 的尺寸在 wxPython 中改變時動態改變圖像尺寸

[英]Changing the image size dynamically when the sizer's size changes in wxPython

我正在 Windows 8 操作系統上使用 python v2.7 和 wxPython v3.0。 在下面提供的代碼片段中,簡單地創建了一個框架,該框架具有一個包含圖像的垂直尺寸調整器和另一個包含兩個面板的水平尺寸調整器。

問題:當我通過拖動邊框調整框架大小時,面板會自動調整大小。 與面板不同,圖像不會調整大小? 在調整大小的情況下,如何使我的圖像表現得像面板?

代碼:使用的圖像文件可以從這里下載: green.bmp

import wx

class Frame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, style=wx.DEFAULT_FRAME_STYLE)
        panelA = wx.Panel(self,-1)
        imageFile = wx.Image('greenbig.bmp', wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        myBitmap = wx.StaticBitmap(panelA, -1, imageFile)

        panel1 = wx.Panel(self, -1,style=wx.SIMPLE_BORDER)
        panel2 = wx.Panel(self, -1, style=wx.SIMPLE_BORDER)
        panelSizer = wx.BoxSizer(wx.HORIZONTAL)
        panelSizer.Add(panel1, 1, wx.ALL|wx.EXPAND, 0)
        panelSizer.Add(panel2, 1, wx.ALL|wx.EXPAND, 0)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(panelA, 1, wx.ALL|wx.EXPAND, 0)
        sizer.Add(panelSizer,  1, wx.ALL|wx.EXPAND, 0)
        self.SetSizer(sizer)

        self.Show(True)

app = wx.App()
frame = Frame(None, wx.ID_ANY, 'Image')
app.MainLoop()

感謝您的時間!

(八年后)我正在努力展示一張使用 window 幀動態調整大小的圖像。 這些天,我將Python 3wxPython version 4一起使用。 我通過大量閱讀文檔和有關如何最好地使用 sizer 的提示拼湊出這個解決方案。 然后我將我的代碼削減到完成這個狹窄用例所需的絕對最低限度。

請注意,我從未調用Frame.Layout()Panel.Layout() ,因為我依賴於Frame的初始大小以及Frame中的單個Panel將隨Frame自動調整大小這一事實。 此外,對Fit()的任何調用都是不必要的。 包含ImagePanel的 sizer 確實需要EXPAND標志,但ImagePanel本身不需要 sizer。

注意:您必須提供自己的示例圖像才能加載。

import wx


class ImagePanel(wx.Panel):
    def __init__(self, parent):
        super().__init__(parent)
        self.img = wx.Image(width=1, height=1)
        self.ctrl = wx.StaticBitmap(self, bitmap=self.img.ConvertToBitmap())
        self.Bind(wx.EVT_SIZE, self.on_resize)

    def load_image(self):
        with open('image.png', 'rb') as fin:
            self.img = wx.Image(fin)
        self.update_bitmap()

    def update_bitmap(self):
        w, h = self.GetSize()
        self.ctrl.SetBitmap(self.img.Scale(w, h).ConvertToBitmap())

    def on_resize(self, evt):
        self.update_bitmap()


class MainWindow(wx.Frame):
    def __init__(self):
        initial_size = wx.Size(width=480, height=480)
        super().__init__(None, wx.ID_ANY, title='Main Window Title', size=initial_size)
        self.panel = wx.Panel(self)
        self.image = ImagePanel(self.panel)

        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(self.image, proportion=1, flag=wx.EXPAND)
        self.panel.SetSizer(vbox)


if __name__ == '__main__':
    app = wx.App()
    win = MainWindow()
    win.Show()
    win.image.load_image()
    app.MainLoop()

圖像將永遠不會自動調整大小。 如果您想要這種行為,則需要處理wxEVT_SIZE並自己在其處理程序中進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM