В wxpython есть wx.CallDuring - PullRequest
       17

В wxpython есть wx.CallDuring

0 голосов
/ 01 октября 2011

Я нашел wx.CallAfter и wx.CallLater в документации, но ни одна не решает мою проблему.Я пытаюсь обновить строку состояния во время выполнения задачи, но wx.CallAfter и wx.CallLater обновляются только после задачи.

Пример:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# generated by wxGlade 0.6.3 on Fri Sep 30 20:55:34 2011

import wx
import time
# begin wxGlade: extracode
# end wxGlade



class MyFrame1(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrame1.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.frame_2_statusbar = self.CreateStatusBar(1, 0)

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: MyFrame1.__set_properties
        self.SetTitle("frame_2")
        self.frame_2_statusbar.SetStatusWidths([-1])
        # statusbar fields
        frame_2_statusbar_fields = ["foo"]
        for i in range(len(frame_2_statusbar_fields)):
            self.frame_2_statusbar.SetStatusText(frame_2_statusbar_fields[i], i)
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MyFrame1.__do_layout
        self.Layout()
        # end wxGlade
    def Test(self):
    time.sleep(10)
        for i in range(0,100):
        time.sleep(0.1)
        txt="I <3 Stack Exchange x " +str( i)
        wx.CallAfter(self.frame_2_statusbar.SetStatusText,txt, 0)
        wx.CallAfter(self.Update)
        print txt
# end of class MyFrame1


if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_1 = MyFrame1(None, -1, "")
    app.SetTopWindow(frame_1)
    frame_1.Show()
    wx.CallAfter(frame_1.Test)
    app.MainLoop()

1 Ответ

3 голосов
/ 04 октября 2011

Судя по всему, "CallDuring" - это не более чем простой вызов любой функции, которую вы хотите.Он будет вызван именно тогда, когда вы это называете.Есть ли причина, по которой прямой вызов не решает вашу проблему?

Однако вы говорите своей программе, что она спит.Никакое количество «звонка во время» не поможет вам, так как вы кладете все приложение в режим сна.Может быть, вы думаете, что sleep - хорошая симуляция «реального» кода, но это не так.Вы фактически говорите своей программе «остановить всю обработку», которая включает обновления экрана.

Суть вашей проблемы в том, что вы не позволяете циклу обработки событий перерисовывать события.Вы можете попытаться вызвать wx.Yield () в вашем цикле, но наличие большого и продолжительного цикла в главном потоке программы с графическим интерфейсом - это запах кода.Почти наверняка есть лучший способ подойти к вашей проблеме.

Лучший совет, который я могу дать, это поиск по "wxpython long running task".Скорее всего, первым попаданием станет страница wxpywiki под названием " Long Running Tasks ", которая может оказаться для вас полезной.

...