4

wxpython 2.8.11.0、python 2.7

Sizerいくつかのコントロールを直接Frame好きなものに入れると

import wx

app=wx.App()

frm = wx.Frame(None, title='title')

sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(wx.SpinCtrl(frm))
sizer.Add(wx.SpinCtrl(frm))

frm.SetSizerAndFit(sizer)
frm.Show()

app.MainLoop()

には、Frameを含む正しい最小サイズが自動的に設定され、Sizerそれよりも小さくすることはできません。間に (コントロール間のタブ移動に必要な)がある場合Panel、これは機能しません。ウィンドウが小さすぎる可能性があります。

import wx

app=wx.App()

frm = wx.Frame(None, title='title')
pan = wx.Panel(frm)

sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(wx.SpinCtrl(pan))
sizer.Add(wx.SpinCtrl(pan))

pan.SetSizerAndFit(sizer)
frm.Show()

app.MainLoop()

さらに、同じ動作を得るにはfrm.Fit()とが必要です。frm.SetMinSize(frm.GetEffectiveMinSize())完全なコード:

import wx

app=wx.App()

frm = wx.Frame(None, title='title')
pan = wx.Panel(frm)

sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(wx.SpinCtrl(pan))
sizer.Add(wx.SpinCtrl(pan))

pan.SetSizerAndFit(sizer)
frm.Fit()
frm.SetMinSize(frm.GetEffectiveMinSize())
frm.Show()

app.MainLoop()

は大丈夫ですがfrm.Fit()、嫌いfrm.SetMinSize(frm.GetEffectiveMinSize())です。前と同じようにFrameの最小サイズを自動的に考慮するようにするためのより良い解決策はありませんか? 別のコントロールがサイザーに追加された後の変更がどうなるかを考えています。PanelSizerEffectiveMinSize

編集: どうやら

panel.SetSizerAndFit(sizer)
frm.Fit()
frm.SetMinSize(frm.GetEffectiveMinSize())

に置き換える必要があります

panel.SetSizer(sizer)
sizer.SetSizeHints(frm)

ややきれいに見えます。全体として、これは次のようになります

import wx

app=wx.App()

frm = wx.Frame(None, title='title')
pan = wx.Panel(frm)

sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(wx.SpinCtrl(pan))
sizer.Add(wx.SpinCtrl(pan))

pan.SetSizer(sizer)
sizer.SetSizeHints(frm)
frm.Show()

app.MainLoop()

これはこれを行うための好ましい方法ですか?

ウィジェットが後で追加された場合、最初のアプローチでさえ、介入なしでは正しくならないので、それはまったく別の質問だと思いますSizer.Frame

4

2 に答える 2

4

最もエレガントな方法 (IMHO) は、フィニアスの回答に記載されています。不要なサイザーを追加するのは少し非効率的ですが、実際に目立つことはないと思います。

最後の例のように、手動で呼び出す人もいますがSetSizeHints()、これも同様に機能し、より明確になる可能性があります(追加のサイザーを使用するときはいつでも、削除すべきではない理由を説明するコメントを残す必要があると感じています)。

残念ながらこれ以上の方法はなく、追加できるかどうかもわかりません。これは、すべてのパネル、サイザー、フレームで何かを行う必要があるためです。無関係なパラメーターをそれに渡します。つまり、次のようなものを持つことができます

panel.SetSizerAndFitParent(sizer, frame);

しかし、これがより良いかどうかは明確ではありません。

于 2012-09-26T23:24:14.683 に答える
1

フレーム コンテンツ (パネルなど) を管理するサイザーの導入についてはどうですか? 最小限の例が含まれていないため、まだテストしていません。

frameSizer = wx.BoxSizer(wx.VERTICAL)
frameSizer.Add(panel)
frm.SetSizerAndFit(frameSizer)
于 2012-09-26T19:36:53.970 に答える