События мыши в тексте в Python с использованием wxPython

Это то, что я пытаюсь сделать:

Я создаю окно, и на нем отображается текст, который я нажимаю на текст, например: отображается текст.

'Hello World, I am a Python program.' 

Поэтому, если пользователь щелкает слова, я хочу, чтобы он сгенерировал событие, и он войдет в функцию, и я хочу что-то сделать в функции (например, изменить цвет этого слова, поэтому мне также нужно отслеживать, какое слово я нажал)

Я не уверен, как это сделать, я мог бы сделать каждое слово кнопкой, но это было бы уродливо.

2 Solutions collect form web for “События мыши в тексте в Python с использованием wxPython”

 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() . 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() 

Решение Йорана прекрасно, если вы не возражаете против каждого слова, похожего на яркую синюю подчеркнутую ссылку.

Для тех, кто заинтересован в выполнении этого БЕЗ синего подчеркнутого текста стиля «hotlink», это может быть достигнуто путем настройки окна RichText. Код ниже – это пример кода для этого: он берет все, что вы помещаете в «текстовую» переменную, и обрабатывает его в окне RichText таким образом, что он выглядит как обычный текст, но каждое слово будет вызывать событие OnURL при нажатии. Ни пользователь, ни программист не должны беспокоиться об установке этого, просто передайте «текст» URL-адресу и обработайте вызовы 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() 
Python - лучший язык программирования в мире.