2

这就是我想要做的:

我创建了一个窗口,上面显示了文本,作为用户,我单击文本,例如:显示的文本是。

'Hello World, I am a Python program.'

因此,如果用户单击单词,我希望它生成一个事件,它会进入一个函数,我想在函数中做一些事情(比如改变那个单词的颜色,所以我还需要跟踪我点击了哪个单词)

我不太确定如何做到这一点,我可以将每个单词都变成一个按钮,但这会很难看。

4

2 回答 2

1
import wx
def SomeListener(evt):
    print "Got Event:",evt
    print "My XY:",evt.GetX(),evt.GetY()
    #youll have to figure out which word you clicked using x,y (note x,y relative to static text field)
a= wx.App(redirect=False)
f = wx.Frame(None,-1)
p = wx.Panel(f,-1)
t = wx.StaticText(p,-1,"Some Text")
t.Bind(wx.EVT_LEFT_DOWN,SomeListener)
f.Show()
a.MainLoop()

或使用 htmlwin ......但它强调了所有的话......我无法弄清楚如何不这样做

import wx

import wx.html
def OnClickWord(e):
    print "You Clicked:",e.GetLinkInfo().GetHref()
    return
class MyHtmlFrame(wx.Frame):

    def __init__(self, parent, title):

        wx.Frame.__init__(self, parent, -1, title)

        html = wx.html.HtmlWindow(self)

        #if "gtk2" in wx.PlatformInfo:

        html.SetStandardFonts()

        html.SetPage(
        "<style>a {text-decoration: none;color: #000; }</style>" #sorry no css support :/
        "<a href=\"word1\">Word1</a> <a href=\"word2\">word 2</a> <a href=\"wizard of oz\">wizard of oz</a>.")

app = wx.PySimpleApp()

frm = MyHtmlFrame(None, "Simple HTML")
frm.Bind(wx.html.EVT_HTML_LINK_CLICKED,OnClickWord)
frm.Show()

app.MainLoop()
于 2012-08-13T02:29:16.250 回答
0

如果您不介意每个单词看起来像亮蓝色下划线链接,那么 Joran 的解决方案很好。

对于那些有兴趣在没有蓝色下划线“热链接”样式文本的情况下执行此操作的人,可以通过设置 RichText 窗口来完成。下面的代码是一个代码示例:它获取您放入“text”变量的任何内容并将其处理到 RichText 窗口中,使其看起来像普通文本,但每个单词在单击时都会引发 OnURL 事件。用户和程序员都不必担心设置,只需将“文本”传递给 URLtagger 并根据需要处理 OnURL 调用。

此示例只是将单击的单词传递给 OnURL 事件,如果您想要每个单词的唯一标识符,请在 URLtagger 方法中添加它们,请注意标识符完全独立于显示的文本,因此您可以根据需要显示文本并接收数字。

import wx
import wx.richtext as rt

class RichTextFrame(wx.Frame):
    def __init__(self, *args, **kw):
        wx.Frame.__init__(self, *args, **kw)
        self.rtc = rt.RichTextCtrl(self, style=wx.VSCROLL|wx.HSCROLL|wx.NO_BORDER);
        wx.CallAfter(self.rtc.SetFocus)
        self.rtc.Bind(wx.EVT_TEXT_URL, self.OnURL)

    def URLtagger(self, text):
        for word in text.split():
            self.rtc.BeginURL(word)
            self.rtc.WriteText(" "+word+" ")
            self.rtc.EndURL()

    def OnURL(self, evt):
        wx.MessageBox(evt.GetString(), "Word Clicked")

class TestPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)
        if rt.RichTextBuffer.FindHandlerByType(rt.RICHTEXT_TYPE_HTML) is not None:
            return
        rt.RichTextBuffer.AddHandler(rt.RichTextHTMLHandler())
        rt.RichTextBuffer.AddHandler(rt.RichTextXMLHandler())
        wx.FileSystem.AddHandler(wx.MemoryFSHandler())
        self.win = RichTextFrame(self, -1, "wx.richtext.RichTextCtrl",
                            size=(700, 500),
                            style = wx.DEFAULT_FRAME_STYLE)
        self.win.Show(True)

app = wx.App(0)
frame = wx.Frame(None)
panel = TestPanel(frame)
frame.Hide()
text = 'It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness.'
panel.win.URLtagger(text)
app.MainLoop()
于 2014-09-06T05:05:49.173 回答