Как принудительно обновить wx.Panel?

Я пытаюсь изменить элементы управления Panel, обновить их, а затем продолжить выполнение кода. Проблема, по-видимому, в том, что панель ожидает простоя, прежде чем она обновится. Конечно, я пробовал обновить, а также GetSizer().Layout() и даже отправил событие изменения размера в фрейм с помощью метода SendSizeEvent(), но безрезультатно. Я тут в недоумении, мне сложно поверить, что нет возможности принудительно перерисовать эту панель. Вот код, который изменяет элементы управления:

def HideButtons(self):
        self.newButton.Show(False)
        self.openButton.Show(False)
        self.exitButton.Show(False)
        self.buttonSizer.Detach(self.newButton)
        self.buttonSizer.Detach(self.openButton)
        self.buttonSizer.Detach(self.exitButton)
        loadingLabel = wx.StaticText(self.splashImage, wx.ID_ANY, "Loading...", style=wx.ALIGN_LEFT)
        loadingLabel.SetBackgroundColour(wx.WHITE)
        self.buttonSizer.Add(loadingLabel)
        self.GetSizer().Layout()
        self.splashImage.Refresh()

Кто-нибудь еще сталкивался с чем-то подобным? И как вы это решили, если да?


person Fry    schedule 05.08.2009    source источник
comment
Вы пробовали self.Show()?   -  person Dana the Sane    schedule 05.08.2009


Ответы (3)


Вам нужно вызвать Update метод.

person Toni Ruža    schedule 05.08.2009
comment
Только Update () в моем случае не помог (StaticBitmaps в GridSizer на Panel), но в документах сказано, что Refresh () вызовет безусловную перерисовку, что и произошло, когда за ним последовал Update () - person virtualnobi; 05.12.2013
comment
Phoenix изменил структуру ссылок на документы. Update перемещено. Это именно то, что я искал. Спасибо! - person CJ Harries; 17.02.2018

У меня был StaticBitmap, который точно так же не обновлялся ни одним из этих методов (включая Update, предложенный в принятом ответе).

Я обнаружил, что вызовов .Hide() и .Show() на Panel было достаточно, чтобы обновить изображение. Я подозреваю, что то же самое было бы, если бы я запускал функции для объекта более низкого уровня, такого как StaticBitmap.

person claytond    schedule 13.07.2013

Вы можете поместить изменяемую часть своей панели на подпанели, например. нравится:

def MakeButtonPanels(self):
    self.buttonPanel1 = wx.Panel(self)
    self.Add(self.buttonPanel1, 0, wxALL|wxALIGN_LEFT, 5)
    # ... make the three buttons and the button sizer on buttonPanel1

    self.buttonPanel2 = wx.Panel(self)
    self.Add(self.buttonPanel2, 0, wxALL|wxALIGN_LEFT, 5)
    # ... make the loading label and its sizer on buttonPanel2

    self.buttonPanel2.Show(False) # hide it by default

def HideButtons(self):
    self.buttonPanel1.Show(False)
    self.buttonPanel2.Show(True)
    self.Layout()
person Ralph    schedule 05.08.2009