Tkinter文本标记范围从开始和结束指数值从wordstart到wordend?

时间:2016-10-11 17:48:30

标签: python tkinter text tags bind

我正在尝试修改一些由ButtonRelease-1 wordstart事件的highlights (tags) words in a tkinter Text widget的Bryan Oakley提供的惊人代码。

我不想突出显示单个单词,而是要点击某些文字,将鼠标拖到同一行(左侧或右侧)的另一个区域,然后突出显示该范围内的全部范围wordend1.0边界。

例如,如果我点击下面代码中 tk 后第一行的结尾,请将鼠标拖到 p import 这个词的em> 并释放我的鼠标按钮,我想要扩展标记以捕获从1.20到{{的全部范围1}}。

下面的代码使用两个tk.StringVar来捕获开始和结束字符串,但是从获得的那两个索引中,我将如何将这些起点和终点应用于该范围,然后展开以突出显示{{1} }和wordstart范围?

wordend

2 个答案:

答案 0 :(得分:4)

您可以将var materials= JSON.parse(localStorage.getItem('materials')); var text=" "; materials.length; function workorders(){ for (i = 0; i < materials.length; i++) { text += "<li>"+materials[i]+"</li>"; } $('#wo_materials').val("<li>"+text+"</li>"); } workorders(); "wordstart"附加到任何有效索引。此外,您不需要使用"wordend" - 它会增加复杂性,并且不会为正常变量提供额外的价值:

以下是一种方法:

StringVar

答案 1 :(得分:0)

发布&#34;我的&#34;解决方案(基于布莱恩的代码和帮助的99%)。如果用户从左到右与从右到左突出显示鼠标,我不确定&#34;最佳&#34;处理它的方法,所以我将索引比较为浮点数,以查看哪个大于或小于并相应地处理了wordstartwordend

import tkinter as tk

class Example(tk.Frame):
  def __init__(self, parent):
    tk.Frame.__init__(self, parent)
    self.text = tk.Text(self, wrap="none")
    self.text.pack(fill="both", expand=True)
    self.text.bind("<Button-1>", self.button_down)
    self.text.bind("<ButtonRelease-1>", self.button_up)

    self.text.tag_configure("highlight", background="green", foreground="black")

    with open(__file__, "rU") as f:
      data = f.read()
      self.text.insert("1.0", data)

  def button_down(self, event):
    self.xy_down = self.text.index('@%s,%s' % (event.x, event.y))
    self.start = self.text.index('@%s,%s' % (event.x, event.y))

  def button_up(self, event):
    self.stop = self.text.index('@%s,%s' % (event.x, event.y))
    self.xy_up = self.text.index('@%s,%s' % (event.x, event.y))
    if self.xy_down == self.xy_up:
      self.text.tag_remove('highlight', 1.0, 'end')
      self.text.tag_add("highlight", 'insert wordstart', 'insert wordend')
    elif float(self.start) > float(self.stop):
      #print('Highlight right to left')
      self.begin = self.text.index('%s wordend' % (self.start))
      self.end = self.text.index('%s wordstart' % (self.stop))
      self.text.tag_remove('highlight', 1.0, 'end')
      self.text.tag_add("highlight", self.end, self.begin)
      print(self.start, self.stop, self.begin, self.end)
    elif float(self.start) < float(self.stop):
      #print('Highlight left to right')
      self.begin = self.text.index('%s wordstart' % (self.start))
      self.end = self.text.index('%s wordend' % (self.stop))
      self.text.tag_remove('highlight', 1.0, 'end')
      self.text.tag_add("highlight", self.begin, self.end)

if __name__ == "__main__":
  root = tk.Tk()
  Example(root).pack(fill="both", expand=True)
  root.mainloop()