wxPython: проблема обновления цвета фона элементов управления

[РЕДАКТИРОВАТЬ - Сокращенный и повторно опубликованный код, пересмотренный вопрос]

Я хотел бы изменить цвет фона рамки (или панели; в зависимости от того, что работает). Проблема в том, что цвет фона элементов управления в этом кадре (или панели) не обновляется, пока я не щелкну элемент управления (в частности, элемент управления ползунка).

Есть какие нибудь идеи как это починить?

Вот некоторый демонстрационный код:

import wx

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.panel_1 = wx.Panel(self, -1)
        self.sliderDarken = wx.Slider(self.panel_1, -1, 206, 0, 255)
        self.label_3 = wx.StaticText(self.panel_1, -1, "This slider should darken the main panel.\n")
        self.btnPopup = wx.Button(self.panel_1, -1, "This button will pop up a dialog to dim the panel.")
        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_COMMAND_SCROLL, self.onDarken, self.sliderDarken)
        self.Bind(wx.EVT_BUTTON, self.onDialogPopup, self.btnPopup)

    def __set_properties(self):
        self.SetTitle("Main Frame")

    def __do_layout(self):
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_3.Add(self.sliderDarken, 0, 0, 0)
        sizer_3.Add(self.label_3, 0, 0, 0)
        sizer_3.Add(self.btnPopup, 0, 0, 0)
        self.panel_1.SetSizer(sizer_3)
        sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        self.Layout()

    def onDarken(self, event): 
        self.panel_1.SetBackgroundColour(wx.Colour(self.sliderDarken.GetValue(),self.sliderDarken.GetValue(),self.sliderDarken.GetValue()))
        self.panel_1.Refresh()

    def onDialogPopup(self, event): 
        dlgPopup=MyDialog1(None)
        dlgPopup.Show()



class MyDialog1(wx.Dialog):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.DEFAULT_DIALOG_STYLE
        wx.Dialog.__init__(self, *args, **kwds)
        self.sliderDarkenPopup = wx.Slider(self, -1, 206, 0, 255, style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS)
        self.label_2 = wx.StaticText(self, -1, "This slider should darken the panel on the main frame.")
        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_COMMAND_SCROLL, self.onDarkenPopup, self.sliderDarkenPopup)

    def __set_properties(self):
        self.SetTitle("Dimmer Pop up")


    def __do_layout(self):
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_2.Add(self.sliderDarkenPopup, 0, 0, 0)
        sizer_2.Add(self.label_2, 0, 0, 0)
        self.SetSizer(sizer_2)
        sizer_2.Fit(self)
        self.Layout()

    def onDarkenPopup(self, event): 
        frame_1.panel_1.SetBackgroundColour(wx.Colour(self.sliderDarkenPopup.GetValue(),self.sliderDarkenPopup.GetValue(),self.sliderDarkenPopup.GetValue()))
        frame_1.panel_1.Refresh()



if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_1 = MyFrame(None, -1, "")
    app.SetTopWindow(frame_1)
    frame_1.Show()
    app.MainLoop()
10.11.2009 19:53:16
2 ОТВЕТА

Попробуйте поместить панель в каждом кадре, а затем поместить элементы управления на панель. В wxPython фреймы не любят иметь несколько окон (особенно для ОС Windows), поэтому обычно полезно, чтобы у фрейма была одна панель, а у панели - другие элементы управления.

Если это не решит проблему, пожалуйста, сформулируйте свой вопрос более четко и уменьшите код до самой маленькой программы, которая отображает проблему, и тогда нам (или, по крайней мере, мне) будет легче понять.

1
11.11.2009 04:34:04
Пробовал с панелью, но без разницы. Я также обновил вопрос и код, который я разместил выше.
mark 11.11.2009 17:53:02
Я до сих пор не понимаю. Например, когда вы ожидаете, что цвет фона изменится. Вы делаете ползунок, чтобы изменить цвет фона, но хотите, чтобы он изменился, прежде чем щелкнуть ползунок? Кроме того, на какой ОС вы работаете. В моей системе (Linux) ползунки выглядят вертикальными и настолько маленькими, что не двигаются. Это то, что вы хотите?
tom10 11.11.2009 18:07:55

Попробуйте сгенерировать и обработать wx.SysColourChangedEvent.

  def onDarken(self, event): 
        self.panel_1.SetBackgroundColour(wx.Colour(self.sliderDarken.GetValue(),self.sliderDarken.GetValue(),self.sliderDarken.GetValue()))
        event = wx.SysColourChangedEvent()
        self.ProcessEvent(event)
1
13.11.2009 21:56:28