在Python2.7中更新Tkinter GUI时出现全局/本地命名空间问题?

在Python2.7中更新Tkinter GUI时出现全局/本地命名空间问题?,python,user-interface,tkinter,threadpool,concurrent.futures,Python,User Interface,Tkinter,Threadpool,Concurrent.futures,编辑: 我已经在Python2.7中使用Tkinter构建了一个用户界面,并且还使用concurrent.futures模块在套接字上接收数据。现在,我希望每当sock.recv()上有新数据时,GUI都能更新,但这并没有发生,可能是因为全局“val1”在未来的一个线程(处理套接字)中更新,而不是在处理GUI的另一个线程中更新。因此,GUI中包含val1的列表框保持静态。这是一个很长的代码,所以我没有把整个代码放在这里,而是添加了一个伪代码来澄清这个问题 from Tkinter import

编辑: 我已经在Python2.7中使用Tkinter构建了一个用户界面,并且还使用concurrent.futures模块在套接字上接收数据。现在,我希望每当sock.recv()上有新数据时,GUI都能更新,但这并没有发生,可能是因为全局“val1”在未来的一个线程(处理套接字)中更新,而不是在处理GUI的另一个线程中更新。因此,GUI中包含val1的列表框保持静态。这是一个很长的代码,所以我没有把整个代码放在这里,而是添加了一个伪代码来澄清这个问题

from Tkinter import *
import concurrent.futures
....

class UserInterface(Frame):
    def __init__(self, root):
        Frame.__init__(self, root)
        self.root = root

        global var1, var2

        # Rest of the code

        self.update()
        root.mainloop() # I have to do this, otherwise the GUI doesn't show


    def update(self):
        try:
            self.var1 = var1
            self.var2 = var2

            # Inserting/displaying the latest values of var1 and var2 in Listbox defined in the constructor
            # Rest of the update function

            self.root.after(5000, update)
        except:
            pass


def conn_handler(conn, addr):
    global val1, val2
    while True:
        buff= conn.recv(2048)
        data= json.loads(buff.strip('x'))    # 'x' is the EOL character
        val1 = ''.join(data[key1]) # not exactly but something like this
        val2 = ''.join(data[key2]) # and so on

def ui_handler():
    root= Tk()
    my_gui = UserInterface(root)
    # I earlier put my_gui.root.mainloop() here but that doesn't help either


def main():
    with concurrent.futures.ThreadPoolExecutor(5) as executor:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        sock.bind((HOST, PORT))
        while True:
            sock.listen(5)
            conn, addr = sock.accept()
            future1 = executor.submit(conn_handler, conn, addr)
            future2 = executor.submit(ui_handler)
            concurrent.futures.wait([future1, future2])


if __name__=='__main__':
    val1 = {'key1':value1, 'key2':value2, 'key3':value3, 'key4':value4, 'key5':value5}
    val2 = {'key1':value1, 'key2':value2, 'key3':value3, 'key4':value4}
    main()
当我运行它时,代码中没有错误,但它没有执行我希望执行的操作,即,在每次接收套接字上有新数据时更新GUI。我的方法/逻辑是否有错误


p.S.一般来说,我对Python和编程都很陌生,所以请友好一点

这可能不是本地或全局名称空间的问题;也可能是文本框或列表框不刷新的简单问题。我建议在每个更新函数中,删除小部件中的早期值,然后插入任何新内容

在您的情况下,类似这样的情况:

self.list_box.delete(0, END)
for i in range(len(values)):
    self.list_box.insert(END, values[i])

另外,请提供一个与“澄清问题的伪代码”相反的代码。如问题中所述,这是一个非常长的代码,我正在执行各种其他操作,因此我认为使用伪代码进行解释更容易。虽然我同意这一点,但提供一个更清晰的代码。而且比这更容易理解。嗯。。。在这种情况下,请给我一些时间,让我拿出一个简洁的代码来模仿我的代码的基本行为&然后我将用这个最小的、完整的和可验证的例子来编辑这个问题。真不敢相信它会这么简单!谢谢你,伙计!