0

gtk textview オブジェクト内の文字列の開始/終了位置を返すスクリプトがあります。何度も同じことをしているような気がします。最初の検索関数は、各一致位置の開始と終了を返します。2番目は、配列で指定されたテキストビュー内の各オブジェクトを検索して強調表示することを望んでいました。searchn() 配列の選択を変更して、最後から 2 番目または選択したものを選択できることに気付きました。

クリックごとに配列内の各オブジェクトを一度に 1 つずつ選択して、配列内の 1 つのオブジェクトを順番に強調表示する方法はありますか。

だから私が4つの言葉を持っているなら

仕事仕事仕事仕事仕事

次に、最初のものを強調表示してからもう一度クリックすると、関数が再実行され、2番目、3番目が強調表示され、すべてが完了したら最初に戻ることができます。for range in len(z): これを実行しますが、for ループで何を実行しても、最後のステップの最後の 1 つのステップが選択されます。これが理にかなっていることを願っています。

def search(x):
search_required = False
sbuffer.remove_tag_by_name('found', sbuffer.get_start_iter(), sbuffer.get_end_iter())
    find_text = findentry.get_text()
    if find_text:
  text = sbuffer.get_text(sbuffer.get_start_iter(),sbuffer.get_end_iter()).decode('utf8')
      search_matches = [(match.start(), match.end()) for match in re.finditer(re.escape(find_text), text, re.IGNORECASE)]
      if len(search_matches) < 1000:
    for start,end in search_matches:
      iter1 = sbuffer.get_iter_at_offset(start)
      iter2 = sbuffer.get_iter_at_offset(end)
      sbuffer.select_range(iter1, iter2)
      sbuffer.apply_tag_by_name('found', iter1, iter2)
    textview.scroll_to_mark(sbuffer.get_mark('insert'), 0.25)
    print search_matches
    return search_matches
else:
  search_matches = [ ]    



  def searchn(x):
search(x)
z=search(x)
#def SN(z)
print len(z)
z=z[:1]# need to have this do to 2nd,3rd,4th,5th ect till there are no more matches.
for a,l in z:
  print a,"start of this match"
  print l, "end of this match"
  iter1 = sbuffer.get_iter_at_offset(a)
  iter2 = sbuffer.get_iter_at_offset(l)
  sbuffer.select_range(iter1,iter2)
  print z
return z  

前もって感謝します!

4

2 に答える 2

0

数日前に夢の中でそのアイデアが思い浮かんだことを知っています. 私はそれを台無しにし続けました...:P ここは働いています。ありがとう、JazzyWhite!Python の前方および後方検索機能。そんなものを作りたいと思っている方の参考になれば幸いです。Base は私のメインクラスで、sbuffer は textview.get_buffer() です。そうです、私は gtk を使用しています。

  searchmatchp=None
  searchmatchf=None
  def search(x):
sbuffer.remove_tag_by_name('found', sbuffer.get_start_iter(), sbuffer.get_end_iter())
    find_text = findentry.get_text()
    if find_text:
  text = sbuffer.get_text(sbuffer.get_start_iter(),sbuffer.get_end_iter()).decode('utf8')
      search_matches = [(match.start(), match.end()) for match in re.finditer(re.escape(find_text), text, re.IGNORECASE)]
      if len(search_matches) < 1000:
    for start,end in search_matches:
      iter1 = sbuffer.get_iter_at_offset(start)
      iter2 = sbuffer.get_iter_at_offset(end)
      sbuffer.select_range(iter1, iter2)
      sbuffer.apply_tag_by_name('found', iter1, iter2)
    textview.scroll_to_mark(sbuffer.get_mark('insert'), 0.25)
    Base.searchmatchp=search_matches
    Base.searchmatchf=search_matches
    #return search_matches
else:
  search_matches = [ ]    



  def searchn(self):
print Base.searchmatchf
for a,l in Base.searchmatchf[:1]:
  iter1 = sbuffer.get_iter_at_offset(a)
  iter2 = sbuffer.get_iter_at_offset(l)
  sbuffer.select_range(iter1,iter2)
  textview.scroll_to_mark(sbuffer.get_mark('insert'), 0.25)
del Base.searchmatchf[:1]  
if Base.searchmatchf ==[]:
  search(self)




  def searchp(self):
print Base.searchmatchp
del Base.searchmatchp[-1:] 
print Base.searchmatchp[-1:]
for a,l in Base.searchmatchp[-2:]:
  iter1 = sbuffer.get_iter_at_offset(a)
  iter2 = sbuffer.get_iter_at_offset(l)
  sbuffer.select_range(iter1,iter2)
  textview.scroll_to_mark(sbuffer.get_mark('insert'), 0.25)
if Base.searchmatchp ==[]:
  search(self)
于 2013-04-10T02:16:09.823 に答える