【发布时间】:2015-07-17 05:24:48
【问题描述】:
我正在尝试使用系统调用或子流程来实现事件驱动的流程。基本上我想启动一个非阻塞系统命令,并在完成该系统调用后,我想要调用一个函数。 这样我就可以启动一个 GUI 进度条,启动一个系统命令并让进度条继续,当系统调用完成时,让进度条停止。
我绝对不想做的是生成一个进程,获取它的进程 ID 并在 while 循环中继续检查该进程的完成情况。
以下只是我想象的应该如何工作的示例(所有这些都在一个类中)
def launchTool(self):
self.progressbar.config(mode = 'indeterminate')
self.progressbar.start(20)
self.launchButton.config(state = 'disabled')
self.configCombobox.config(state = 'disabled')
## here the "onCompletion" is a pointer to a function
call("/usr/bin/make psf2_dcf", shell=True, onCompletion = self.toolCompleted)
def onCompletion(self):
print('DONE running Tool')
self.progressbar.stop()
self.launchButton.config(state = 'normal')
self.configCombobox.config(state = 'normal')
【问题讨论】:
-
产生一个线程,使用回调
-
您使用的是什么 GUI 框架?执行此操作的正确方法在某种程度上取决于此。
-
我正在使用 tkinter 作为 GUI
-
@Mario,你能说得更具体点吗?我正在研究,事实证明我可以使用“进程”和“队列”生成一个进程。你是这个意思吗。像这样:q = Queue() p1 = Process(target=someFunction, args=(q,)) p1.start()
-
你的操作系统是什么?你不需要线程;您可以处理
SIGCHLD信号(写入 fd 以在信号处理程序中触发 I/O 事件或直接使用诸如signalfd之类的 OS 接口(使用tk.createfilehandler订阅以侦听 I/O 事件)。跨度>
标签: python progress-bar subprocess event-driven