【问题标题】:Clear Tkinter Entry text - so new text looks new?清除 Tkinter 条目文本 - 所以新文本看起来很新?
【发布时间】:2011-11-04 13:05:17
【问题描述】:

我想修改下面的代码以在写入新文本之前清除条目文本。基本上我想删除文本,等待一秒钟,然后编写新文本。这应该给出正在写入的“新”文本的外观。 有任何想法吗? 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()

在另一个名为海报的文件中

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

【问题讨论】:

    标签: python multithreading tkinter message-queue tkinter-entry


    【解决方案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)
    

    【讨论】:

    • @antanakos - 首先,感谢您的回复。我的代码存在缺陷,因为按下按钮只能启动一个线程。应禁止后续按压。基于此,队列将只有一个数据源,并且可能不需要数据处理程序。您的代码非常有帮助。我现在明白,如果我想清除文本,我只需在队列上放一个空刺。我会试一试。谢谢 - 布拉德
    • doh,在队列中放置一个空字符串效果很好。我试图更改直接插入一个空字符串;不是通过队列。再次感谢 - 布拉德
    【解决方案2】:

    进行了这些更改并且它有效...感谢@anonakos。请参阅我的 cmets 对他的回答。

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

    【讨论】:

      猜你喜欢
      • 2014-07-13
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      相关资源
      最近更新 更多