当子进程在 Python 中写入 curses window 时输出错误
Bad output when child processes writes into curses window in Python
我需要你的建议。我必须制作一个 python 程序,它将有一个用 curses 模块编程的用户界面,几个子进程应该写入一个由 curses 创建的 window
我有这个代码:
#!/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
请帮帮我。我几乎尝试了我所知道的一切。
谢谢。
它没有按预期工作,因为 multiprocessing
创建了单独的子进程,这些子进程不知道其他子进程在屏幕上的什么位置离开了光标。您可以通过将消息后的光标移动到每个子进程中的相同位置(进行额外的刷新)来解决这个问题。 worker 函数中的类似内容:
self.window.addstr(i, 0, msg)
self.window.refresh()
self.window.move(10, 0)
self.window.refresh()
我需要你的建议。我必须制作一个 python 程序,它将有一个用 curses 模块编程的用户界面,几个子进程应该写入一个由 curses 创建的 window 我有这个代码:
#!/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
请帮帮我。我几乎尝试了我所知道的一切。 谢谢。
它没有按预期工作,因为 multiprocessing
创建了单独的子进程,这些子进程不知道其他子进程在屏幕上的什么位置离开了光标。您可以通过将消息后的光标移动到每个子进程中的相同位置(进行额外的刷新)来解决这个问题。 worker 函数中的类似内容:
self.window.addstr(i, 0, msg)
self.window.refresh()
self.window.move(10, 0)
self.window.refresh()