2

これについてインターネットで多くの投稿を見てきましたが、アドバイスはどれも機能しません。

ここに私のテストコードがあります:

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 コントロール内のレンダリングされたテキストの実際のサイズをどうにかして把握できれば、コントロールのサイズを明示的に設定して、サイザーにその作業をさせることができると考えています。

これは、達成するのが比較的簡単なことのように思えます...

アドバイスをいただければ幸いです。

4

1 に答える 1

1

重要なのは、静的なテキスト スタイルです。ラップを機能させるには、複数行スタイルを有効にする必要がありました: wx.TE_MULTILINE。

また、サイザーではなく、パネル自体にレイアウトを設定しましたが、それは問題に関連していない可能性があります。

私のマシン、Windows 7 64 ビットでは、SetFont 呼び出しを変更する必要がありました。元に戻す必要がある場合があります。

import math
from threading import Thread
import time
import wx

e = lambda x: complex(math.cos(x), 0) + complex(0, math.sin(x))
r = lambda x: ((e(0*math.pi/3.0)*e(x)).real + 1)/2.0
g = lambda x: ((e(2*math.pi/3.0)*e(x)).real + 1)/2.0
b = lambda x: ((e(4*math.pi/3.0)*e(x)).real + 1)/2.0
colo = lambda rad: map(lambda x: int(128 * x(rad)), [r, g, b])

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))
        self.panel.SetBackgroundColour(wx.Colour(*colo(0)))

        # Setup sizer for vertical centering
        self.sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.panel.SetSizer(self.sizer)

        # Create text field
        self.txtField = wx.StaticText(self.panel, size=(448, -1), style=(wx.ALIGN_CENTRE_HORIZONTAL | wx.TE_MULTILINE ))
        self.txtField.SetFont(wx.Font(36, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))      
        self.txtField.SetForegroundColour(wx.Colour(255, 255, 255))
        self.txtField.SetLabel(text)
        self.txtField.Wrap(448)
        self.sizer.Add(self.txtField, 1, 0, 15)

        # Add the static text to the sizer
        # Ensure layouts are applied
        self.panel.Layout()
        self.panel.Refresh()

        # Thaw UI
        self.Thaw()

        # Center form
        self.Center()

        self.angle = 0
        self.angle_inc = (2*math.pi)/25.0

    def change_colour(self):
        t = Thread(target=self.epilepsy_mode)
        t.start() 

    def epilepsy_mode(self):
        while True:
            time.sleep(0.02)
            self.panel.SetBackgroundColour(wx.Colour(*colo(self.angle)))
            self.panel.Refresh()
            self.angle = (self.angle + self.angle_inc) % (2*math.pi)

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() 
c.change_colour()

app.MainLoop()
于 2013-07-23T04:32:08.907 に答える