2

私はwx.BoxSizersを使用して、(ここでは簡略化された)プログラムの要素を整列させています。青いpanel1を4:3のアスペクト比で成形する必要がありますが、フレームを埋めるために拡張し、そのために、proportion=1を指定します。ただし、テキストをpanel1の真下に配置しますが、できるだけ小さくします(porportion = 0)

ただし、これを設定すると、panel1が下向きに展開され(おそらく形状が設定されていても)、テキストがウィンドウの下部にプッシュされます。ウィンドウのサイズが変更されても、テキストを「ハグ」するpanel1が必要です。これを修正するにはどうすればよいですか?ありがとう!

import wx

class myWindow(wx.Window):
    def __init__(self, parent, size):
        wx.Window.__init__(self, parent=parent, size=size)
        self.SetBackgroundColour(wx.BLUE)

class MainWindow(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent=parent, size=(500,500) )

        self.panel1 = myWindow(self, size=(400,300))
        self.text = wx.StaticText(self, label="This is text.")

        self.mainSizer = wx.BoxSizer(wx.VERTICAL)
        self.mainSizer.Add(self.panel1, 1, wx.ALIGN_TOP | 
                           wx.SHAPED | wx.EXPAND | wx.ALL, border=10)
        self.mainSizer.Add(self.text, 0, wx.EXPAND | 
                           wx.ALIGN_TOP | wx.LEFT, border=10)
        self.SetSizer(self.mainSizer)
        self.Show()

app = wx.App(False)
panel = MainWindow(None)
app.MainLoop()
4

2 に答える 2

1

パネルの形状が原因で、正確に取得することはできません。フレームを小さくしすぎると、パネルがテキストから縮小します。ただし、SetSizeHintsメソッドを使用してフレームの最小サイズを設定できます。これにより、この問題を防ぐことができます。次に、テキストの後にスペーサーを追加して、パネルに押し付けられるようにします。そのビットには単純なタプルハックを使用しました。少し異なるコードは次のとおりです。

import wx

class myWindow(wx.Panel):
    def __init__(self, parent, size):
        wx.Panel.__init__(self, parent=parent, size=size)
        self.SetBackgroundColour(wx.BLUE)

class MainWindow(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent=parent, size=(500,500) )

        topPanel = wx.Panel(self)
        self.panel1 = myWindow(topPanel, size=(400,300))
        self.text = wx.StaticText(topPanel, label="This is text.")

        self.mainSizer = wx.BoxSizer(wx.VERTICAL)
        self.mainSizer.Add(self.panel1, 8, wx.ALIGN_TOP | 
                           wx.SHAPED | wx.EXPAND | wx.ALL, border=10)
        self.mainSizer.Add(self.text, 0,  
                           wx.ALIGN_TOP | wx.LEFT | wx.BOTTOM, 10)
        self.mainSizer.Add((1,1), 1, wx.EXPAND)
        topPanel.SetSizer(self.mainSizer)
        self.SetSizeHints(500, 500, 3500, 3500)
        self.Show()

app = wx.App(False)
panel = MainWindow(None)
app.MainLoop()

とにかくパネルと呼んでいたので、wx.Windowクラスをwx.Panelクラスに交換したことに注意してください。また、フレームにパネルを配置しました。これは、アプリのクロスプラットフォームのルックアンドフィールに役立つためです(ウィジェット間のタブ操作が可能になります)。

于 2013-01-16T16:07:21.687 に答える
1

アイテムをサイザーに追加するときに、wx.SHAPED フラグを使用して実験することもできます。これはサイザーがアイテムの縦横比を維持することを目的としていますが、私自身が使用してからかなり時間が経ち、まだ正しく機能するかどうかわかりません。;-)

于 2013-01-16T19:09:01.007 に答える