首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建自截断椭圆文本ctrl:如何强制绘制事件

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

Stack Overflow用户
提问于 2012-01-03 15:21:28
回答 1查看 343关注 0票数 0

我正在尝试做一个静态文本,如果太长,它会用一个椭圆截断它自己,只显示适合它的文本。

当您更改窗口的大小时,我所写的内容似乎很好,该窗口必须发送画图事件,但是当设置标签文本时,我想油漆事件不会被触发。

我已经尝试调用刷新和更新我能做的一切(帧,面板,文本本身),以及发送一个油漆事件到框架,但我无法使它正确工作。

我用一个按钮做了一个快速演示,以更改文本标签。

编辑:已解决的

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-10 14:08:17

编辑了上面的代码,现在运行良好,调用文本的父级的Layout()完成了这个任务。我老是忘了那个方法!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8714444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档