我正在尝试制作一个静态文本,如果sizer太长,会用椭圆截断自己,只显示适合的文本。
当你改变必须发送绘画事件的窗口大小时,我所写的内容似乎工作得很好,但是当设置标签文本时我猜想一个paint事件不会被触发。
我尝试过对所有我能做的事情(框架,面板,文本本身)调用刷新和更新,以及向框架发送绘制事件但我无法使其正常工作。
我使用按钮进行了快速演示,以更改文本标签。
编辑:已解决
import wx
from wx.lib.stattext import GenStaticText as StaticText
class EllipticStaticText2(StaticText):
def __init__(self,parent,id=wx.ID_ANY,label='',width=None,pos=wx.DefaultPosition,size=wx.DefaultSize,style=0,name="ellipticstatictext2"):
self.actual_label= label
self.parent= parent
self.width= width
StaticText.__init__(self,parent,id,label,pos,size,style,name)
self.Bind(wx.EVT_PAINT, self.OnPaint2)
def SetLabel(self,label):
self.actual_label= label
StaticText.SetLabel(self,label)
self.parent.Layout()
def SetLabelText(self,label):
self.actual_label= label
StaticText.SetLabelText(self,label)
self.parent.Layout()
def OnPaint2(self,event):
dc= wx.PaintDC(self)
displaylabel= self.actual_label
x,y= dc.GetTextExtent(displaylabel)
self.w,self.h= self.GetSize()
if x>self.w:
while x>self.w:
displaylabel= displaylabel[:-1]
x,y= dc.GetTextExtent(displaylabel+"...")
StaticText.SetLabel(self,displaylabel+"...")
else:
StaticText.SetLabel(self,displaylabel)
event.Skip()
class CustomFrame(wx.Frame):
def __init__(self,parent,id,name,size):
wx.Frame.__init__(self,parent,id,name,size)
self.panel = wx.Panel(self, -1)
sizer = wx.BoxSizer(wx.VERTICAL)
self.index= 35
self.elliptic = EllipticStaticText2(self.panel, -1, r"long string."*20)
whitePanel = wx.Panel(self.panel, -1)
whitePanel.SetBackgroundColour(wx.WHITE)
sizer.Add(self.elliptic, 0, wx.ALL|wx.EXPAND, 10)
btn= wx.Button(self.panel,-1,"change")
sizer.Add(btn,0,wx.ALL|wx.EXPAND, 10)
sizer.Add(whitePanel, 1, wx.ALL|wx.EXPAND, 10)
btn.Bind(wx.EVT_BUTTON,self.button)
self.panel.SetSizer(sizer)
sizer.Layout()
def button(self,event):
self.elliptic.SetLabel(chr(self.index)*100)
self.index+=1
self.Refresh()
self.panel.Refresh()
self.elliptic.Refresh()
if __name__ == "__main__":
app = wx.PySimpleApp()
frame = CustomFrame(None, -1, "EllipticStaticText", size=(700, 300))
frame.CenterOnScreen()
frame.Show()
app.MainLoop()
答案 0 :(得分:0)
编辑上面的代码,现在效果很好,在文本的父级上调用Layout()
就可以了。我一直忘记这种方法!