wxPython:更新控件背景颜色的问题

1 投票
2 回答
2305 浏览
提问于 2025-04-15 15:52

[编辑 - 精简并重新发布代码,重述问题]

我想改变一个框架(或者面板;哪个能用就用哪个)的背景颜色。

问题是,这个框架(或面板)上的控件(特别是滑块控件)的背景颜色不会自动更新,直到我点击这个控件。

有没有什么办法可以解决这个问题?

以下是一些演示代码:

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

2 个回答

1

试着生成并处理一个 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

试着在每个窗口里放一个面板,然后把你的控件放在这个面板上。在wxPython中,窗口不太喜欢有多个子窗口(尤其是在Windows操作系统上),所以通常让窗口拥有一个面板,而这个面板再拥有其他控件会更好。

如果这样做还解决不了问题,请把你的问题描述得更清楚一些,并把代码简化到最小的能显示问题的程序,这样我们(或者至少我)就更容易理解了。

撰写回答