Метод запуска после загрузки экрана wxpython - PullRequest
0 голосов
/ 23 марта 2020

Я знакомлюсь с python / wx python. Я создал класс для панели / сетки. Но я хочу «нарисовать» сетку и только после того, как все будет загружено / показано, я хочу начать запуск метода / функции для подсчета запущенных процессов в Windows. Фрагмент кода:

    self.sb.SetStatusText('Initialising application...')
    self.SetTitle('Computer Check v0.1')
    self.Centre()
    self.Show()

    self.onStart()

def onStart(self):

        self.sb.SetStatusText('Counting processes')     
        count = 0
        for process in c.Win32_Process():
            count +=1
        self.sb.SetStatusText('Found '+str(count)+' running processes')

, но похоже, что все идет быстро, что означает, что приложение рисуется, а onstart () уже запущено ...

Другой Дело в том, что приложение "зависает" во время onstart (), кажется, довольно тяжело использовать WMI ... или, может быть, код просто дерьмо с моей стороны; -)

Не удается найти событие использовать для запуска onstart после загрузки приложения. Как это сделать правильно?

спасибо!

1 Ответ

0 голосов
/ 24 марта 2020

Вы можете использовать wx.CallAfter для запуска вызова, когда событие wx l oop «имеет свободное время», или wx.CallLater для запуска чего-либо через некоторое время.

wx.CallAfter(self.onStart)

I не знаю, если Win32_Process занимает много времени, если это так, он, безусловно, заблокирует пользовательский интерфейс. Лучше всего начать новый поток для выполнения вычислений (Win32_Process), а затем, например, wx.CallAfter, чтобы обновить пользовательский интерфейс. Помните, что вы не можете обновлять пользовательский интерфейс из других потоков.

Когда ваш поток вычисляет значение, вы можете, например,

def thread_run_function(self):
    # perform the calculation...
    wx.CallAfter(self.update_ui, calculated_value)

def update_ui(self, calculated_value):
    self.some_widget.SetLabel("Value: %s" % calculated_value)

Или:

def thread_run_function(self):
    # perform the calculation...
    self.calculated_value = calculated_value
    wx.CallAfter(self.update_ui)

def update_ui(self):
    self.some_widget.SetLabel("Value: %s" % self.calculated_value)
...