wxPython:更新控件的背景色时出现问题

2024-10-01 11:19:55 发布

您现在位置:Python中文网/ 问答频道 /正文

[编辑-缩减和重新发布代码,重述问题]

我想改变一个框架(或面板)的背景颜色,无论哪一个使它工作。 问题是,在我单击控件(尤其是滑块控件)之前,该框架(或面板)上控件的背景颜色不会更新。在

有什么办法解决这个问题吗?在

下面是一些演示代码:

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

Tags: theselfaddinitdefargsframelabel
2条回答

试着在每一帧里放一个面板,然后把你的控件放在面板上。在wxPython中,框架不喜欢有多个窗口(特别是对于windows操作系统),因此通常让框架拥有一个面板,而面板拥有其他控件。在

如果这不能解决问题,请更清楚地表达您的问题,并将您的代码缩减为显示问题的最小程序,这样我们(或至少我)就更容易理解了。在

尝试生成并处理wx.syscolorChangedEvent. 在

  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)

相关问题 更多 >