Найти - Пользователи
Полная версия: Обновление формы(wx).
Начало » GUI » Обновление формы(wx).
1
Saff
Возможно ли избежать “зависания” окна при выполнении ресурсоёмких, или просто долгих операций.
Ну, например, по onclick происходит долгий процесс заполнения ну например листа, то есть операция секунд на 10-20.
При этом если подвигать окно, то элементы перестают обновляться, и программа перестаёт отвечать. Если же не двигать окно, то всё нормально, и все элементы могут изменяться динамично.Возможно ли каким нибудь способом отрисовывать форму, что бы не было зависаний.
Например если в List'e(со скролом) каждые несколько секунд обновляются записи можно было проскролить вниз и ничего не зависло?
Вроде объяснил )))
Ferroman
Сделать заполнение отдельным средом, или рефрешить все во время заполенния.
Saff
Всмысле отдельным средом??
И как отрефрешить всё?Доставать каждый объект?Если да, то как достать только нужные? )
Ferroman
Нет, просто попробуйте добавлять в лист отдельным потоком, а в конце обновить форму.
Но я думаю что можно просто обновлять форму во время заполнения листа, но, может моргать все.
вообще интересно, я попробую на досуге, точнее напишу.
Saff
Вопрос: ))) Как обновить форму, я немного запутался в объектах ))
Ferroman
Пример - додаем 10000 строчек в ListBox в отдельном потоке.

    class AddListThread(threading.Thread):
        def __init__(self, lb1):
            self.lb1 = lb1
            threading.Thread.__init__(self)
        def run(self):
            for i in range(100000):
                self.lb1.Insert(str(i), i, clientData=None)
                self.lb1.Update()
    class TestListBox(wx.Panel):
        def __init__(self, parent, log):
            self.log = log
            wx.Panel.__init__(self, parent, -1)
            wx.StaticText(self, -1, "This example add itemsto the wx.ListBox control in thread.", (20, 10))
            self.lb1 = wx.ListBox(self, 60, (100, 50), (90, 120), ['',], wx.LB_SINGLE)
            self.b = wx.Button(self, 10, "Add 100000 items to ListBox", (300, 20))
            self.Bind(wx.EVT_BUTTON, self.OnClick, self.b)
        def OnClick(self, event):
            AddListThread(self.lb1).start()
Обновляем только ListBox. Все остальное будет обновляется само, в своём потоке.
Проблема есть только в обрывании процесса (при выходе из программы, например).
Про потоки в питоне вот тут хорошо написано.

PS: Код немного странный - я просто модифицировал код демки ListBox из пакета wxPython Docs Demos and Tools
Saff
Огромное спасибо за ответ, сегодня попробую!!
Saff
Попробывал, всё получилось!Сначала были проблемы с потерей фокуса(а вследствии невозможность управлять формой), но я насильно поставил перевод фокуса на листбокс и всё нормально стало.Спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB