首页 > 解决方案 > 如何使用 IPC 从 Process 更新 GUI

问题描述

我有一些进程正在运行,它们时不时会尝试更改 tkinter 按钮的颜色。我已经在这里待了大约一天,但无法提出解决方案。如何使用 IPC 做到这一点?

标签: pythontkinterprocess

解决方案


您可以mulitprocessing.Queue用作桥梁,将按钮的颜色从一个进程转移到另一个进程:

import tkinter as tk
import multiprocessing as mp
import time
from itertools import cycle

def msgs(q):
    ''' process to send button color to main process periodically '''
    colors = cycle(('red', 'green', 'blue', 'cyan', 'orange'))
    while True:
        q.put(next(colors))
        time.sleep(3)

def check(q):
    ''' get color from queue and set button background to that color '''
    try:
        color = q.get(False)
        btn.config(bg=color)
    except:
        # queue is empty
        pass
    btn.after(1000, check, q)

if __name__ == '__main__':
    root = tk.Tk()
    root.geometry('400x200')

    btn = tk.Button(root, text='Hello')
    btn.pack()

    queue = mp.Queue() # create the shared queue
    proc = mp.Process(target=msgs, args=(queue,), daemon=True)
    proc.start()

    check(queue)
    root.mainloop()

推荐阅读