修改 我在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和编程都很陌生,所以请善待!
答案 0 :(得分:1)
它可能不是本地或全局命名空间的问题;它也可能是一个简单的文本框或列表框不刷新的问题。我建议在每个更新功能中,你曾经删除小部件中的早期值,然后插入任何新的!
在你的情况下,像这样:
train-panca-<images>
train-canca-<images>