Skip to main content
 首页 » 编程设计

python之清除 Tkinter 条目文本之所以新文本看起来很新

2025年05月04日11jackei

我想修改下面的代码以在写入新文本之前清除条目文本。基本上我想删除文本,等一秒钟,然后写新文本。这应该给出正在编写的"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)) 

请您参考如下方法:

因为可能有很多线程写入队列(每次按下按钮一个线程),所以有点不清楚何时应该删除文本和应该插入新文本。例如,如果文本刚刚写入并且新文本到达,新文本是应该立即写入还是应该添加到队列中以便稍后在时间允许时显示?

您可以设置状态处理程序来处理删除命令和插入命令。这个版本的处理程序在每次插入发送回删除命令后启动一个线程。如果删除命令的 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)