我正在编写一个wxPython应用程序,它需要与现有Windows应用程序的外观匹配。
我试图把静态文本和按钮控件放在渐变背景的面板上。以下是我找到的方法,但我还是忍不住觉得自己错过了什么。我应该如何绘制静态文本和自定义控件并让背景显示出来?在以某种方式说服本地控制者不要画背景。这尤其适用于wxStaticText
启用“全局系统”选项
msw.window.no-clip-children让背景显示出来?在
传递一个重新绘制函数,该函数将修补每个函数的背景
控件的onPaint处理程序期间
2似乎是最简单的,但我想知道是否有原因关闭它。在全局范围内启用“无剪辑子对象”是否会影响性能?有没有办法只打开我想要的窗户?在
编辑:示例代码和脚本
抱歉,如果这看起来像是一个问题的答案。我想知道有没有正确的方法来做这件事。在
#!/usr/bin/python
import wx
class GradientPanel(wx.Panel):
def __init__(self,*args,**kwargs):
wx.Panel.__init__(self,*args,**kwargs)
self.Bind(wx.EVT_PAINT,lambda e: self.paintBackground())
self.Bind(wx.EVT_ERASE_BACKGROUND,lambda e: None)
self.t=wx.StaticText(self,pos=(30,20),label="wxStaticText. Looks bad on MSW")
self.t2=MyStaticText(self,pos=(30,50), size=(300,25), label="MyStaticText. Needs ClipChildren turned off")
self.t3=MyStaticTextWithCustomBackground(self,pos=(30,80),size=(300,25), label="This Control touches up its own background",paintBackgroundToDC=self.paintBackgroundToDC)
def paintBackground(self):
dc=wx.PaintDC(self)
self.paintBackgroundToDC(self,dc)
def paintBackgroundToDC(self,ofWindow,dc=None):
r=self.GetScreenRect()
r.SetTopLeft(ofWindow.ScreenToClient(r.GetTopLeft()))
dc.GradientFillLinear(r,wx.Colour(240,240,240),wx.Colour(128,128,255),wx.SOUTH)
class MyStaticText(wx.Window):
def __init__(self,parent,label,**kwargs):
wx.Window.__init__(self,parent,**kwargs)
self.label=label
self.Bind(wx.EVT_PAINT,lambda e: self.repaint())
self.Bind(wx.EVT_ERASE_BACKGROUND,lambda e: None)
def repaint(self):
self.repaintToDC(wx.PaintDC(self))
def repaintToDC(self,dc):
dc.DrawText(self.label,0,0)
class MyStaticTextWithCustomBackground(MyStaticText):
def __init__(self,parent,label,paintBackgroundToDC=None,**kwargs):
self.paintBackgroundToDC=paintBackgroundToDC
MyStaticText.__init__(self,parent,label,**kwargs)
def repaint(self):
dc=wx.PaintDC(self)
if self.paintBackgroundToDC:
self.paintBackgroundToDC(self,dc)
MyStaticText.repaintToDC(self,dc)
if __name__ == "__main__":
#wx.SystemOptions.SetOptionInt('msw.window.no-clip-children',1)
app=wx.PySimpleApp()
frame=wx.Frame(None,title="Transparent Controls")
panel=GradientPanel(frame)
frame.Show()
app.MainLoop()