子进程在Python中写入curses窗口时输出错误

时间:2016-11-07 18:01:53

标签: python multiprocessing curses

我需要你的建议。我必须创建一个python程序,它将使用curses模块编写用户界面,并且几个子进程应该写入由curses创建的一个窗口 我有这段代码:

#!/bin/python3

import multiprocessing
import curses
import time


class GUI:

    def __init__(self):
        self.lock = multiprocessing.Lock()
        self.window = curses.initscr()
        self.window.erase()
        self.window.refresh()

    def worker(self, i, msg):
        self.lock.acquire()
        try:
            self.window.addstr(i, 0, msg + "\n")
            self.window.refresh()
        finally:
            self.lock.release()

    def work_hub(self):

        jobs = []
        for i in range(5):
            child = multiprocessing.Process(target=self.worker, args=(i, "Worker" + str(i)))
            jobs.append(child)
            child.start()

        for job in jobs:
            job.join()

        time.sleep(5)
        curses.endwin()


if __name__ == "__main__":

    displayer = GUI()
    displayer.work_hub()

但这就是我的输出结果:

Worker0

Worker1


Worker2



Worker3




Worker4

我需要这个输出:

Worker0
Worker1
Worker2
Worker3
Worker4

请帮帮我。我几乎尝试了所知的一切。 谢谢。

1 个答案:

答案 0 :(得分:0)

它不能按预期工作,因为multiprocessing创建了单独的子进程,这些子进程不知道屏幕上其他子进程离开游标的位置。您可以通过将消息后的光标移动到每个子进程中的相同位置(进行额外刷新)来解决此问题。在worker函数中有类似的东西:

      self.window.addstr(i, 0, msg)
      self.window.refresh()
      self.window.move(10, 0)
      self.window.refresh()