wxPython RichTextCtrl 带删除线

Posted

技术标签:

【中文标题】wxPython RichTextCtrl 带删除线【英文标题】:wxPython RichTextCtrl with strikethrough 【发布时间】:2014-03-31 05:38:57 【问题描述】:

我想在RichTextCtrlwxPython 中设置带有删除线的文本。但找不到像BeginStrikethroughSetStrikethrough 这样的方法。

是否可以在RichTextCtrl 中应用删除线?怎么样?

编辑 1:

Font 带有删除线标志,与 BeginFontEndFont 一起使用不产生删除线效果

import wx
import wx.richtext as rt

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, 1, 'Testing strike-through')
        rtc = rt.RichTextCtrl(self, -1)
        rtc.WriteText("normal text")
        rtc.Newline()

        font = wx.FFont(12, wx.FONTFAMILY_DEFAULT, face='Tahoma', flags=wx.FONTFLAG_STRIKETHROUGH)
        rtc.BeginFont(font)
        rtc.WriteText("This is strike-through")
        rtc.EndFont()

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = MyFrame()
    frame.Show()
    app.MainLoop()

输出:

【问题讨论】:

我没有看到那个函数,但它确实有一个BeginFont 函数,所以你可以创建一个带删除线的字体,然后这样使用它。 嗨@CorleyBrigman,我尝试了BeginFontEndFont,但没有给出删除效果。请参阅有问题的EDIT 1 我自己并没有真正使用过,但看起来下面还有另一个答案。 是的@CorleyBrigman,它为我工作了 100% :) 【参考方案1】:

    你可以使用font.SetStrikethrough(True)wxpython2.9.4 or higher,参考This Link

    否则:使用font.SetNativeFontInfoFromString(str) 设置带有原生信息描述的标志。

请检查以下字符串以查看差异,仅在 windows 中测试:

无删除线的描述:0;-16;0;0;0;400;0;0;0;1;0;0;2;32;Tahoma

带删除线的描述:0;-16;0;0;0;400;0;0;1;1;0;0;2;32;Tahoma

代码:

import wx
import wx.richtext as rt

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, 1, 'Testing strike-through')
        rtc = rt.RichTextCtrl(self, -1)
        rtc.WriteText("normal text")
        rtc.Newline()

        font = wx.FFont(12, wx.FONTFAMILY_DEFAULT, face='Tahoma', flags=wx.FONTFLAG_STRIKETHROUGH)

        info = font.GetNativeFontInfoDesc()
        info = self.setFontInfoStrikethrough(info)
        font.SetNativeFontInfoFromString(info)

        rtc.BeginFont(font)
        rtc.WriteText("This is strike-through")
        rtc.EndFont()

    def setFontInfoStrikethrough(self, info):
        print "orig:", info
        info = info.split(";")
        info[8] = r'1'
        info = ";".join(info)
        print "new :",info
        return info

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = MyFrame()
    frame.Show()
    app.MainLoop()

【讨论】:

Thnx @Jerry_Y,您提供的 otherwise 方法对我来说效果很好。我正在使用 wxPython2.8,所以它很棒,我不需要升级到 2.9 或更高版本.. thnx 再次:)【参考方案2】:

您可以使用文本效果,这也适用于 wxPython 2.8.12:

style = rt.TextAttrEx()
style.SetFlags(rt.TEXT_ATTR_EFFECTS)
style.SetTextEffects(rt.TEXT_ATTR_EFFECT_STRIKETHROUGH)
style.SetTextEffectFlags(rt.TEXT_ATTR_EFFECT_STRIKETHROUGH)
rtc.BeginStyle(style)
rtc.WriteText("This is strike-through")
rtc.EndStyle()

(在 Linux 上测试)

【讨论】:

以上是关于wxPython RichTextCtrl 带删除线的主要内容,如果未能解决你的问题,请参考以下文章

从 wxPython MenuBar 中删除菜单

Python GUI编程(wxPython)

wxpython 布局管理

Wxpython pannel切换

Python爬糗百热门20条并邮件分发+wxPython简易GUI+py2app转成可运行文件

wxPython的安装(Windows)