これについてインターネットで多くの投稿を見てきましたが、アドバイスはどれも機能しません。
ここに私のテストコードがあります:
import wx
class DisplayText(wx.Dialog):
def __init__(self, parent, text="", displayMode=0):
# Initialize dialog
wx.Dialog.__init__(self, parent, size=(480,320), style=( wx.DIALOG_EX_METAL | wx.STAY_ON_TOP ) )
# Freeze UI so user won't see stuff flashing
self.Freeze()
# (For Mac) Setup a panel
self.panel = wx.Panel(self,size=(480,320))
self.panel.SetBackgroundColour(wx.Colour(0,0,128))
# Setup sizer for vertical centering
self.sizer = wx.BoxSizer(wx.HORIZONTAL)
# Create text field
self.txtField = wx.StaticText(self.panel,size=(448,-1),style=wx.ALIGN_CENTRE_HORIZONTAL)
self.txtField.SetLabel(text)
self.txtField.Wrap(448)
self.txtField.SetLabel(self.txtField.GetLabel())
self.txtField.SetFont(wx.Font(36, wx.DEFAULT, wx.BOLD, 0))
self.txtField.SetForegroundColour(wx.Colour(255,255,255))
# Add the static text to the sizer
self.sizer.Add(self.txtField,1, 0,15)
self.panel.SetSizer(self.sizer)
# Ensure layouts are applied
self.sizer.Layout()
# Thaw UI
self.Thaw()
# Center form
self.Center()
app = wx.App(False)
c = DisplayText(None, text="Now is the time for all good men to come to the aid of their country.")
c.Show()
import wx.lib.inspection
wx.lib.inspection.InspectionTool().Show()
app.MainLoop()
StaticText の私の理解に基づいて、Wrap()
関数を呼び出すと、コントロールがテキストをラップしますが、コントロールのサイズは変更されないという問題があるようです。これは、ラップされたテキストの実際の垂直方向のサイズを知らないサイザーが、静的テキストを適切に再配置できないことを意味します。
wx.EXPAND を使用することを提案した投稿が見つかりましたが、これでは問題は解決しません。サイザーが StaticText を拡張できるようにすると、単に StaticText がフレーム全体を埋めるようになります。また、StaticText はそれ自体で垂直方向に中央揃えにならないため、テキストは中央ではなくフォームの上部に配置されます。
別の投稿では、サイザーで wx.ALIGN_CENTER_VERTICAL を試してみることを提案しましたが、同じ問題が残っているため、これも役に立ちませんでした。サイザーはコントロールのサイズに対してのみ機能し、テキストがラップされた後、コントロールのサイズは変更されません。そして再レンダリング。
さまざまな試みの結果、テキストが折り返されてフォームの上部に表示される、最初の行のみがフォームの中央に表示される、最初の行のみがフォームの上部に表示される、テキストが折り返されずに表示される、という結果になりました。したがって、フォームの右端から流れ出します。しかし、私が読んだものの組み合わせでは、フォームのラップされたテキストを垂直方向に中央揃えにすることはできませんでした。
したがって、私ができる必要があるのは、折り返しが行われた後にテキストの垂直方向のサイズをどうにかして把握することです。プラットフォームが異なる場合、または同じプラットフォームであっても、テキスト自体に基づいても、フォントの垂直方向のピクセル サイズが異なる可能性があるため、これを想定することはできません。したがって、これは何らかの方法で計算する必要があります。
StaticText コントロール内のレンダリングされたテキストの実際のサイズをどうにかして把握できれば、コントロールのサイズを明示的に設定して、サイザーにその作業をさせることができると考えています。
これは、達成するのが比較的簡単なことのように思えます...
アドバイスをいただければ幸いです。