Python/wxWidgets:在包装的静态文本中垂直对齐文本
我在互联网上看到了很多关于这方面的帖子,但没有一条建议有效 以下是我的测试代码:Python/wxWidgets:在包装的静态文本中垂直对齐文本,python,wxwidgets,Python,Wxwidgets,我在互联网上看到了很多关于这方面的帖子,但没有一条建议有效 以下是我的测试代码: 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
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控件中计算出渲染文本的实际大小,那么我就可以显式地设置控件的大小,然后让sizer完成它的工作
这似乎应该是一个相对简单的事情来完成
建议将不胜感激 关键是静态文本风格;您需要启用换行的多行样式: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()