Рубрики
Без рубрики

WXPYPHON: Создание собственного монитора процесса поперечного платформа с PsUtil

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

На этой неделе я столкнулся с забавным проектом Python по имени Psutil в Google Code. Он говорит, что работает на Linux, Windows, OSX и FreeBSD. То, что он делает, это захватывает все беговые процессы и дает вам информацию о них, а также дает вам возможность прекращать их. Поэтому я подумал, что было бы удовольствием поставить графический интерфейс на него и создать собственную службу диспетчера/мониторинга процессов с WxPython. Если у вас есть момент, вы можете прийти к путешествию, поскольку я беру вас через 4 итерацию моего кода.

Первый прототип

Моя первая версия только показывает, что в данный момент работает в то время, когда сам приложение запускается и использует WX.Timer для обновления каждые 5 секунд. Я использовал ObjectListView Widget Чтобы отобразить данные, которые на самом деле не включены в Wxpython, поэтому вам нужно будет пойти, если вы хотите запустить код.

Есть довольно очевидная проблема с этой реализацией. Можете ли вы сказать, что это такое? Ну, процесс получения информации о процессе является бесдужно, поэтому GUI делает паузу каждые 5 секунд. Это раздражает! Итак, давайте добавим резьбу, чтобы исправить эту проблему.

Добавление резьбы в приложение для ALPHA 2 В этой второй версии мы добавляем резьбу и PUBSUB, чтобы пропустить информацию от потока в GUI проще. Обратите внимание, что нам также нужно использовать wx.callafter, чтобы позвонить в Pubsub, поскольку pubsub не безопасен. Импорт PSUTIL # http://code.google.com/p/pusutil/Импорт WX от ObjectListView Import ObjectListView, Collectefn из резьбы импортной резьбы из wx.lib.pubsub Импорт Издатель ############################################################################################################################################################################ ################################################## ########## ProCthread Class (Thread): «« Получает всю информацию о процессе, нам нужна как Psutil, не очень быстрая »« »# —————- ——————————————————– —— def __init __ (Self): «« Конструктор »« «» нить .__ init __ (Self) Self.Start () # ———————– ——————————————————– – Def Run (Self): «« »« »« ».get_pid_List () procs = [] для PID в PIDS: попробуйте:.process (PID) (p.name, str (p.pid), p.exe, p .username, str (p.get_cpu_percent ()), str (p.get_memory_percent ())) proc.appenceend (new_proc), кроме: print “Ошибка получения PID #% S Информация«% PID # Отправить PIDS на GUI WX.callafter (Publisher (). SendMessage, «Обновление», Procs) ################################################## ###################### класс процесса (объект): “” Определение модели процесса для объектаListView “” “# ———— ——————————————————– ———– Def __init __ (Self, name, pid, exe, user, cpu, mem,): “” Конструктор “” “############# ################################################## ######### класс mainpanel (wx.panel): “” “” “# ——————————- ———————————————— Def __init __ (Self, родитель ): «Конструктор» “” wx.panel .__ init __ (я,) self.Procs = [] (Self, .lc_report | wx.sunken_border) self.sountProcs () .boxsizer (wx.vertical) mainsizer.add (self.procmonolv, 1, wx.expand | wx.all, 5) self. Setsizer (Mainsizer) # Проверьте наличие обновлений каждые 5 секунд. Исполнитель Self.bind (wx.evt_timer, self.update, self.timer) self.timer.Start (15000) Self.SetProcs () # Создать Pubsub приемник Издательство (). Подпишитесь (self.updateissplay, “Обновление”) # ————————————— —————————————- Def SetProcs (Self): «« «» «« »Cols = [ ColumnDefn («Имя», «Левый», 150, «Имя»), ColumnDefn («PID», «Левый», 50, «PID»), ColumnDefn («Расположение« EXE »,« слева », 100,« EXE » ), Columndefn («Имя пользователя», «Левый», 75, «Пользователь»), ColumnDefn («ЦП», «Левый», 75, «ЦП»), Columndefn («Mem», «Левый», 75, «Mem» “), #Columnd EFN («Описание», «Left», 200, «Desc»)] Self.ProcMonolv.SetColumns (Cols) Self.ProcMonolv.SetObjects (Self.Procs) # —————- ——————————————————– —— Def Update (Self, событие): «Начните нить, чтобы получить информацию PID» «Self.timer.stop () ProCthread () # ————- ——————————————————– ——— Def UpdatedisPlay (Self, MSG): «« »« «» .data Self.SetProcs () Если не Self.timer.isrunning (): self.timer.start (15000) ## ################################################## #################### Класс mainframe (wx.frame): “” “” “” # —————— ——————————————————– —– def __init __ (Self): «« Конструктор »« »« WX.Frame .__ init __ (Self, none) (self) self.show () Если __name__: .app (false) () app.ma.ma INLOOP () Мы также увеличили количество секунд между обновлениями до 15 лет. Я сделал это в основном, потому что он обновлялся слишком быстро, и я не смог хорошо посмотреть на мой список, прежде чем обновить