Как заставить принудительно обновить wx.Panel? - PullRequest
9 голосов
/ 05 августа 2009

Я пытаюсь изменить элементы управления 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()

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

Ответы [ 3 ]

13 голосов
/ 05 августа 2009

Вам необходимо вызвать метод Update.

4 голосов
/ 13 июля 2013

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

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

1 голос
/ 05 августа 2009

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

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()
...