我最初想用Python创建一个带监视程序和进程的文件监视系统。在我的程序中,我有一个FileSystemEventHandler
子类(DirectoryMonitorHandler
)来监视文件夹更改。声明全局队列,以便DirectoryMonitorHandler
将项插入队列。然后,队列可以处理用于处理DirectoryMonitorHandler
插入的对象的子类。以下是我的程序中的代码段:
if __name__ == "__main__":
# The global queue that is shared by the DirectoryMonitorHandler and BacklogManager is created
q = Queue()
# Check if source directory exists
if os.path.exists(source):
# DirectoryMonitorHandler is initialized with the global queue as the input
monitor_handler = DirectoryMonitorHandler(q)
monitor = polling.PollingObserver()
monitor.schedule(monitor_handler, source, recursive = True)
monitor.start()
# BacklogManager is initialized with the global queue as the input
mamanger = BacklogManager(q)
mamanger.start()
mamanger.join()
monitor.join()
else:
handleError('config.ini', Error.SourceError)
这个程序工作正常,但现在我决定添加一个GUI组件。以下是我到目前为止的情况:
class MonitorWindow(wx.Frame):
def __init__(self, parent):
super(MonitorWindow, self).__init__(parent, title='Monitor', size=(size_width, size_height))
staticBox = wx.StaticBox(self, label='Monitor Status:', pos=(5, 105), size=(size_width - 28, size_height/3))
self.statusLabel = wx.StaticText(staticBox, label='None', pos=(10, 35), size=(size_width, 20), style=wx.ALIGN_LEFT)
self.InitUI()
def InitUI(self):
panel = wx.Panel(self)
self.SetBackgroundColour(background_color)
self.Centre()
self.Show()
def updateStatus(self, status):
self.statusLabel.SetLabel('Update: ' + status)
if __name__ == '__main__':
app = wx.App()
window = MonitorWindow(None)
app.MainLoop()
此窗口工作正常,但我不确定如何将这两个组件集成在一起。 wxPython GUI应该作为一个单独的进程运行吗?我以为我可以创建一个MonitorWindow
的实例,在它们启动之前将其传递给DirectoryMonitorHandler
和BacklogManager
。
我也读过这个http://wiki.wxpython.org/LongRunningTasks,它确实解释了wxPython窗口如何与线程一起工作,但是我需要它来处理一个进程。另一种可能的解决方案是,我必须在DirectoryMonitorHandler
类中创建并启动BacklogManager
和Window
的实例。你们觉得怎么样?
答案 0 :(得分:1)
wxPython本身应该是主要进程,它应该启动监视文件系统的长时间运行进程。如果您使用的是多处理模块,那么您应该阅读以下内容之一:
您提到的Long Running Tasks wiki文章非常适合学习如何使用wxPython和线程。我已多次使用该文章中的技术而没有任何问题。