2

以下のコードを変更して、新しいテキストが書き込まれる前にエントリ テキストをクリアしたいと考えています。基本的に、テキストを削除し、1 秒待ってから新しいテキストを書きたいと思います。これにより、「NEW」テキストが書き込まれているように見えるはずです。何か案は?TIA - ブラッド

    import thread, Queue, time, random, poster
    from Tkinter import *

    dataQueue = Queue.Queue()

    def status(t):
        try:
            data = dataQueue.get(block=False)
        except Queue.Empty:
            pass
        else:
            t.delete(0, END)
            time.sleep(1)
            t.insert(0, '%s\n' % str(data))
        t.after(2, lambda: status(t))

    def makethread():
        thread.start_new_thread(poster.poster, (1,dataQueue))    

    if __name__ == '__main__':
        root = Tk()
        root.geometry("240x45")
        t = Entry(root)
        t.pack(side=TOP, fill=X)
        Button(root, text='Start Epoch Display',
                command=makethread).pack(side=BOTTOM, fill=X)
        status(t)
        root.mainloop()

poster という別のファイルに

    import random, time

    def poster(id,que):
        while True:
            delay=random.uniform(5, 10)
            time.sleep(delay)
            que.put(' epoch=%f, delay=%f' % (time.time(), delay))
4

2 に答える 2

1

潜在的に多くのスレッドがキューに書き込みを行っているため (ボタンが押されるたびに 1 つ)、テキストを削除し、新しいテキストを挿入する必要があるタイミングが少し不明確です。たとえば、テキストが書き込まれた直後に新しいテキストが到着した場合、新しいテキストをすぐに書き込む必要がありますか?それとも、時間が許す限り後で表示するためにキューに追加する必要がありますか?

削除コマンドと挿入コマンドを処理するようにステータス ハンドラを設定できます。このバージョンのハンドラーは、削除コマンドを送り返す挿入のたびにスレッドを開始します。delete コマンドの ID が現在表示されているテキストの ID と一致する場合、ステータス ハンドラは表示を消去します。

def status(t, current_id, queue):
    try:
        data = queue.get(block = False)

        # Insert text for ID command:
        if type(data) == tuple:
            (id, str) = data
            t.delete(0, END)
            t.insert(0, str)
            current_id = id

            # Thread that sends a delete command
            # after a fixed delay.
            make_delete_thread(id, queue)

        # Delete text for ID command:
        elif data == current_id:
            t.delete(0, END)

    except Queue.Empty:
        pass

    t.after(10, lambda: status(t, current_id, queue))

def make_delete_thread(id, queue):
    thread.start_new_thread(delete_thread, (id, queue))

def delete_thread(id, queue):
    time.sleep(1)
    queue.put(id)
于 2011-08-28T14:20:24.563 に答える
0

これらの変更を行い、動作します... @anonakos に感謝します。彼の答えに対する私のコメントを参照してください。

Main code:
    else:
        t.delete(0, END)
        time.sleep(1)
        t.insert(0, '%s\n' % str(data))
    t.after(2, lambda: status(t))

Poster code:
def poster(id,que):
    while True:
        delay=random.uniform(5, 10)
        time.sleep(delay-0.5)
        que.put(' ')
        time.sleep(.5)
        que.put(' epoch=%f, delay=%f' % (time.time(), delay))
于 2011-08-28T17:07:07.970 に答える