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

时间:2018-01-10 16:26:10

标签: python user-interface tkinter threadpool concurrent.futures

修改 我在Python 2.7中使用 Tkinter 构建了一个用户界面,我还在 concurrent.futures 模块的套接字上接收数据。现在,我希望GUI能够更新,只要在 sock.recv()上有新数据但是没有发生,可能是因为全局&# 39; val1' 正在一个未来的线程(即处理套接字)中更新,而不是正在处理GUI的另一个线程。因此,包含val1的GUI中的 Listbox 保持静态。这是一个非常长的代码,所以我没有把整个代码放在这里,而只是添加一个伪代码来澄清问题。

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和编程都很陌生,所以请善待!

1 个答案:

答案 0 :(得分:1)

它可能不是本地或全局命名空间的问题;它也可能是一个简单的文本框或列表框不刷新的问题。我建议在每个更新功能中,你曾经删除小部件中的早期值,然后插入任何新的!

在你的情况下,像这样:

train-panca-<images>
train-canca-<images>