创建自截断椭圆文本ctrl:如何强制绘制事件

时间:2012-01-03 15:21:29

标签: python wxpython

我正在尝试制作一个静态文本,如果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()

1 个答案:

答案 0 :(得分:0)

编辑上面的代码,现在效果很好,在文本的父级上调用Layout()就可以了。我一直忘记这种方法!