这就是我想要做的:
我创建了一个窗口,上面显示了文本,作为用户,我单击文本,例如:显示的文本是。
'Hello World, I am a Python program.'
因此,如果用户单击单词,我希望它生成一个事件,它会进入一个函数,我想在函数中做一些事情(比如改变那个单词的颜色,所以我还需要跟踪我点击了哪个单词)
我不太确定如何做到这一点,我可以将每个单词都变成一个按钮,但这会很难看。
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()
如果您不介意每个单词看起来像亮蓝色下划线链接,那么 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()