wxPython富文本控件中的删除线

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

是否可以在RichTextCtrl中应用删除线?如何实现?

编辑1:

使用带有删除线标志的FontBeginFontEndFont一起使用不能产生删除线效果。

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 函数,你可以使用它来创建一个带删除线的字体,并这样使用。 - Corley Brigman
嗨@CorleyBrigman,我尝试了BeginFontEndFont,但没有产生删除线效果。请参见问题中的EDIT 1 - arvinchhi
我自己实际上没有使用过它,但是看起来下面有另一个可行的答案。 - Corley Brigman
是的@CorleyBrigman,它对我来说百分之百有效 :) - arvinchhi
2个回答

4

输入图像描述

  1. 你可以在 wxpython2.9.4 或更高版本下使用 font.SetStrikethrough(True),参考 此链接

  2. 否则:使用 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()

谢谢@Jerry_Y,你提供的otherwise方法对我非常有效。我正在使用wxPython2.8,所以很好,我不需要升级到2.9或更高版本..再次感谢:) - arvinchhi

0

你可以使用文本效果,这也适用于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上测试过)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接