2011-08-26 53 views
2

我想修改下面的代碼來清除在寫入新文本之前的條目文本。基本上我想刪除文本,等待一秒鐘,然後寫入新的文本。這應該給出正在寫入的「新」文本的外觀。 任何想法? TIA - 布拉德清除Tkinter條目文本 - 新文本看起來新?

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

在叫海報

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

回答

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)) 
1

由於有許多潛在的線程寫入隊列(一個用於每次按下按鈕時),另一個文件是有點不清楚的時候文本應該被刪除並且應該插入新的文本。例如,如果文本剛剛寫入並且新文本到達,是應該立即寫入新文本,還是應該將其添加到隊列中以便稍後顯示時間?

您可以設置狀態處理程序來處理刪除命令以及插入命令。此版本的處理程序在每次發送刪除命令的插入後啓動一個線程。如果刪除命令的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) 
+0

@antanakos - 首先,感謝您的答覆。我的代碼有缺陷,只有一個線程應該按下按鈕啓動。後續的壓力應該被禁止。基於此,隊列將只有一個數據源,並且可能不需要數據處理程序。你的代碼非常有幫助。我現在明白,如果我想清除文本,我只需要在隊列中放一個空洞的刺。我會試一試。謝謝 - 布拉德 – Verohomie

+0

doh,在隊列中放置一個空字符串很好。我試圖改變直接插入一個空字符串;不通過隊列。再次感謝 - 布拉德 – Verohomie