1

いくつかの異なるパネルを含むフレームがあり、すべてのパネルが同じ背景画像を取得します。だから私はこの例を見つけました : http://www.blog.pythonlibrary.org/2010/03/18/wxpython-putting-a-background-image-on-a-panel/ )" をこの例から取得し、それを EVT_ERASE_BACKGROUND にバインドします。結果: パネルは背景画像を灰色で再描画します。背景画像の幅は同じですが、パネルよりも高くなっています。ここで、パネルが画像を再描画することがわかります: http://s14.directupload.net/file/d/3030/ej22mwbx_jpg.htm (緑色の下部は私の画像の一部です; 灰色の四角形は私のパネルです)。これらの行も __init__ に追加しました。

import wx

class MyForm(wx.Frame):
    def __init__(self):    
        wx.Frame.__init__(self, None, wx.ID_ANY, "Click Kick",size=(1124,750),pos=((wx.DisplaySize()[0]-1024)/2,10))
        self.startpanel = wx.Panel(self,size=(1024,600))
        self.hideallpanels()
        self.startpanel.Show()
        #...  
        wx.StaticText(self.startpanel,-1,'Testtext',pos=(120,220))
        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        #self.sizer.Add(self.panelnewgame, 1, wx.EXPAND)
        #self.sizer.Add(self.panelloadgame, 1, wx.EXPAND)
        self.SetSizer(self.sizer)    
        #hSizer = wx.BoxSizer(wx.HORIZONTAL)
        #hSizer.Add((1,1), 1, wx.EXPAND)
        #hSizer.Add(self.sizer, 0, wx.TOP, 100)
        #hSizer.Add((1,1), 0, wx.ALL, 75)
        #self.SetSizer(hSizer)
        self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)

    def hideallpanels(self):
        self.startpanel.Hide()
        #...

    def OnEraseBackground(self, evt):
        dc = evt.GetDC()
        if not dc:
            dc = wx.ClientDC(self)
            rect = self.GetUpdateRegion().GetBox()
            dc.SetClippingRect(rect)
        dc.Clear()
        bmp = wx.Bitmap("background.bmp")
        dc.DrawBitmap(bmp, 0, 0)

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

しかし、これらの行ではプログラムを開始できません。エラー メッセージは表示されませんが、開始されません。

編集: ウィンドウのサイズが変更されたときに、背景画像 (またはその他のもの) のサイズを変更する必要はありません。ウィンドウは静的であり、サイズ変更されるべきではありません。

Edit2: 上記のコード例を、関連する可能性のあるすべてのコードで更新しました。

Edit3: 申し訳ありませんが、実行されるようになりました。「background.bmp」という名前の背景画像が必要です。これは wx.Panel よりも大きい必要があります (または、wx.Panel のサイズを小さくします) -> パネルが画像を再描画することを確認してください。

4

1 に答える 1

3

問題は親の問題です。チュートリアルの残りの部分を見ると、EVT_ERASE_BACKGROUND をフレームではなくパネルにバインドしていることに気付くでしょう。また、OnEraseBackground ハンドラーはフレームではなくパネルを更新するため、数行を変更する必要があります。

class MyForm(wx.Frame):
    def __init__(self):
        ...
        # change the last line in the init
        self.startpanel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)

    def OnEraseBackground(self, evt):
        dc = evt.GetDC()
        if not dc:
            dc = wx.ClientDC(self)
            # change this line too!!
            rect = self.startpanel.GetUpdateRegion().GetBox()

ただし、フレームの SetSizeHints メソッドを使用して、サイズ変更の上限と下限を設定することをお勧めします。そうしないと、フレームのサイズを画像よりも大きくすると、境界線が灰色になります。

于 2012-10-02T13:25:49.197 に答える