2

wx.PyControlを含むことができますwx.Sizerか?

私が最終的にここでやろうとしていること (フロート値を持つスピナー) は、別の質問で既に回答されていることに注意してください。wx.PyControl私は、独自のカスタム ウィジェットを作成する必要がある場合に役立つスキルである、内でのウィジェットのレイアウトに特に興味があります。私はすでに CreationCustomControls を読んでいますが、サブクラス内でサイザーを使用していませんでした。wx.PyControl

以下のコードを使用すると、CustomWidget正しく表示されません。ウィジェットの操作当てはまるDoGetBestSizeと思うので、まだやっていません。私は実際に のでそのことをやっています。wx.Sizerwx.SizerCustomWidget

これが私のコードです(サブウィジェット間のイベントバインディング
なし) :

import wx

class CustomWidget(wx.PyControl):
  def __init__(self, parent):
    wx.PyControl.__init__(self, parent=parent, style=wx.NO_BORDER) # Style added.
    text = wx.TextCtrl(parent=self)
    spin = wx.SpinButton(parent=self, style=wx.SP_VERTICAL)
    sizer = wx.GridBagSizer()
    self.layout(text, spin, sizer)
    self.OnInit(text, sizer)

  def OnInit(self, text, sizer):
    text.SetValue(u"0.000")

  def layout(self, text, spin, sizer):
    self.SetSizer(sizer)
    sizer.Add(text, pos=(0, 0), flag=wx.ALIGN_CENTER)
    sizer.Add(spin, pos=(0, 1), flag=wx.ALIGN_CENTER)
    self.Fit()
    self.Layout() # This is what I lacked. I needed to call .Layout()
    self.CenterOnParent()
4

2 に答える 2

3

はい、できます。Layout() を呼び出して、サイザーにその子を再計算/レイアウトするように指示するだけです。

import wx

class Frame(wx.Frame):
  def __init__(self):
    wx.Frame.__init__(self, None)
    blah  = CustomWidget(self)
    self.Show(True)

class CustomWidget(wx.PyControl):
  def __init__(self, parent):
    wx.PyControl.__init__(self, parent=parent)
    text = wx.TextCtrl(parent=self)
    spin = wx.SpinButton(parent=self, style=wx.SP_VERTICAL)
    sizer = wx.GridBagSizer()
    self.layout(text, spin, sizer)
    self.OnInit(text, sizer)

  def OnInit(self, text, sizer):
    text.SetValue(u"0.000")

  def layout(self, text, spin, sizer):
    self.SetSizer(sizer)
    sizer.Add(text, pos=(0, 0), flag=wx.ALIGN_CENTER)
    sizer.Add(spin, pos=(0, 1), flag=wx.ALIGN_CENTER)
    self.Fit()
    self.Layout()
    self.CenterOnParent()

app = wx.App()
f = Frame()
app.MainLoop()

ちなみに、上記のように実行可能なサンプルを添付できれば、将来的にはいいでしょう:)

于 2010-07-17T16:46:37.540 に答える
1

wxControl から派生したクラスは通常、他のウィジェットを含めるために使用されないため、自動レイアウト コードは存在せず、EVT_SIZE イベントを取得しても Layout() は呼び出されません。EVT_SIZE のハンドラーを Bind() し、そこから self.Layout() を呼び出すことで、その機能をクラスに簡単に追加できます。次に、サイズイベントを取得し、子とサイザーを持っているときのパネルと同じように動作します。

于 2010-07-19T16:12:01.757 に答える