2017-10-20 14 views
1

テキストウィジェットの内容を繰り返し取得したいので、それを分析して何が入力されたのかについての統計を取得できます。これらの統計情報は、ユーザタイプに応じてリアルタイムで更新する必要があります。そのため、すべてのループを更新するには変数currentContentが必要です。私がしたいことは、このようなものです。tkinterでループごとにテキストウィジェットの内容を繰り返し取得する方法は?

main = tk.Tk() 
# Y'know, all the typical window setup stuff. 

currentContent = inputBox.get(0.0,END) 
textBlobContent = TextBlob(currentContent) 
# Basically here I'd do a bunch of stuff using TextBlob. 

main.mainloop() 

ただし、これは機能しません。ウィンドウがロードされるとただちにコンテンツを取得してから停止します。確かにmainloopは繰り返し実行され、Textウィジェットの内容を取得し続ける必要がありますか?

+0

を、私はあなたが 'after'方法を探していると思います。https://のstackoverflow .com/questions/25753632/tkinter-how-to-use-after-method –

+0

@ j_4321 'after'メソッドは?それは各ループの代わりに時間に基づいて行うのではないでしょうか? –

+0

ウィジェットに応じて、StringVar/IntVarと '.trace'メソッドを使用できます。これにより、すべての変更に対して 'trace 'が実行されることに注意してください。同様の考え方ですが、ここに表示されている 'Text'ウィジェットで' .bind'を使用しています:https://stackoverflow.com/questions/17120429/validation-on-tkinter-text-widget – Lafexlos

答えて

5

ほとんどの場合に機能する単純な解決策は、<KeyRelease>にバインドすることです。これにより、ユーザーが入力するたびに関数を呼び出すことができます。これは、データがマウスで貼り付けられたり、他の手段(ツールバーボタンなど)を使用して挿入されるたびにコールバックをトリガーしません。

より堅牢なソリューションは、ウィジェットに何かが挿入または削除されるたびにイベントが生成されるように、ウィジェットのプロキシを設定することです。このプロキシは、ウィジェットで何が行われているか(挿入、削除、選択の変更など)を見て、イベントを生成することができます。このイベントにバインドして、必要な操作を行うことができます。このプロキシは、4つの物事ん

import tkinter as tk 

class CustomText(tk.Text): 
    def __init__(self, *args, **kwargs): 
     """A text widget that report on internal widget commands""" 
     tk.Text.__init__(self, *args, **kwargs) 

     # create a proxy for the underlying widget 
     self._orig = self._w + "_orig" 
     self.tk.call("rename", self._w, self._orig) 
     self.tk.createcommand(self._w, self._proxy) 

    def _proxy(self, command, *args): 
     cmd = (self._orig, command) + args 
     result = self.tk.call(cmd) 

     if command in ("insert", "delete", "replace"): 
      self.event_generate("<<TextModified>>") 

     return result 

:データが挿入または削除されるたびにここで

<<TextModified>>イベントを生成するカスタムテキストクラスの例です

  1. はまず、それが実際のウィジェットを呼び出しますコマンドは、受け取ったすべての引数を渡します。
  2. 次はそれがすべての挿入のためのイベントを生成し、すべてのそれは、仮想イベント
  3. を生成し、そして最後に、それはあなたがこのウィジェットを正確に使用することができます

実際のウィジェットコマンドの結果を返します。そして、

  • 削除します他のTextウィジェットと同様に、<<TextModified>>にバインドできるという利点があります。あなたがテキストウィジェット内の文字数を表示したい場合

    は、たとえば、あなたがこのような何かを行うことができます:

    import tkinter as tk 
    
    # ... import of definition of CustomText goes here ... 
    
    root = tk.Tk() 
    label = tk.Label(root, anchor="w") 
    text = CustomText(root, width=40, height=4) 
    
    label.pack(side="bottom", fill="x") 
    text.pack(side="top", fill="both", expand=True) 
    
    def onModification(event): 
        chars = len(event.widget.get("1.0", "end-1c")) 
        label.configure(text="%s chars" % chars) 
    
    text.bind("<<TextModified>>", onModification) 
    
    root.mainloop() 
    
  • 関連する問題