Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 清除Tkinter条目文本-使新文本看起来是新的?_Python_Multithreading_Tkinter_Message Queue_Tkinter Entry - Fatal编程技术网

Python 清除Tkinter条目文本-使新文本看起来是新的?

Python 清除Tkinter条目文本-使新文本看起来是新的?,python,multithreading,tkinter,message-queue,tkinter-entry,Python,Multithreading,Tkinter,Message Queue,Tkinter Entry,我想修改下面的代码,以便在编写新文本之前清除条目文本。基本上我想删除文本,等一秒钟,然后写新的文本。这应该给正在编写的“新”文本的外观。 有什么想法吗?蒂亚-布拉德 import thread, Queue, time, random, poster from Tkinter import * dataQueue = Queue.Queue() def status(t): try: data = dataQueue.g

我想修改下面的代码,以便在编写新文本之前清除条目文本。基本上我想删除文本,等一秒钟,然后写新的文本。这应该给正在编写的“新”文本的外观。 有什么想法吗?蒂亚-布拉德

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

由于可能有多个线程写入队列(每次按下按钮一个线程),因此不清楚何时删除文本,何时插入新文本。例如,如果刚刚写入文本,新文本到达,是应立即写入新文本,还是应将其添加到队列中,以便在时间允许的情况下稍后显示

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

做了这些改变,它工作了。。。多亏了@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))

@首先,谢谢你的回复。我的代码有缺陷,只有一个线程应该用按钮启动。应禁止后续压榨。基于此,队列将只有一个数据源,可能不需要数据处理程序。你的代码非常有用。我现在明白了,如果我想清除文本,我只需在队列上放置一个空的sting。我要试一试。谢谢-Braddoh,在队列上放置一个空字符串非常有效。我试图直接插入一个空字符串;不是通过队列。再次感谢-布拉德