gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:16:52 24 4
gpt4 key购买 nike

编辑:我在 Python 2.7 中使用 Tkinter 构建了一个用户界面,并且还使用 concurrent.futures 模块在套接字上接收数据。现在,我希望只要 sock.recv() 处有新数据,GUI 就会更新,但这并没有发生,可能是因为全局 'val1' em> 正在一个 future 线程(处理套接字)中更新,但不在处理 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])

关于python - 在 Python2.7 中更新 Tkinter GUI 时出现全局/本地命名空间问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48191904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com