wxpython按钮形状如何修改_WxPython改变了位图按钮的形状

您可能需要为此实现自定义控件.我已经完成了我自己的自定义wxPython控件,所以我继续为你写了一个ShapedButton类. =)

要运行此演示,您只需要三个图像:

> button-normal.png

> button-pressed.png

> button-disabled.png

根据按钮的状态使用三个图像.只需要“正常”,但您可能希望至少提供“正常”和“按下”,以便用户在点击时获得反馈.

该控件仅响应正常位图的非透明区域中的点击.单击并释放时,它会正确触发EVT_BUTTON事件.

请享用!

import wx

class ShapedButton(wx.PyControl):

def __init__(self, parent, normal, pressed=None, disabled=None):

super(ShapedButton, self).__init__(parent, -1, style=wx.BORDER_NONE)

self.normal = normal

self.pressed = pressed

self.disabled = disabled

self.region = wx.RegionFromBitmapColour(normal, wx.Color(0, 0, 0, 0))

self._clicked = False

self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)

self.Bind(wx.EVT_SIZE, self.on_size)

self.Bind(wx.EVT_PAINT, self.on_paint)

self.Bind(wx.EVT_LEFT_DOWN, self.on_left_down)

self.Bind(wx.EVT_LEFT_DCLICK, self.on_left_dclick)

self.Bind(wx.EVT_LEFT_UP, self.on_left_up)

self.Bind(wx.EVT_MOTION, self.on_motion)

self.Bind(wx.EVT_LEAVE_WINDOW, self.on_leave_window)

def DoGetBestSize(self):

return self.normal.GetSize()

def Enable(self, *args, **kwargs):

super(ShapedButton, self).Enable(*args, **kwargs)

self.Refresh()

def Disable(self, *args, **kwargs):

super(ShapedButton, self).Disable(*args, **kwargs)

self.Refresh()

def post_event(self):

event = wx.CommandEvent()

event.SetEventObject(self)

event.SetEventType(wx.EVT_BUTTON.typeId)

wx.PostEvent(self, event)

def on_size(self, event):

event.Skip()

self.Refresh()

def on_paint(self, event):

dc = wx.AutoBufferedPaintDC(self)

dc.SetBackground(wx.Brush(self.GetParent().GetBackgroundColour()))

dc.Clear()

bitmap = self.normal

if self.clicked:

bitmap = self.pressed or bitmap

if not self.IsEnabled():

bitmap = self.disabled or bitmap

dc.DrawBitmap(bitmap, 0, 0)

def set_clicked(self, clicked):

if clicked != self._clicked:

self._clicked = clicked

self.Refresh()

def get_clicked(self):

return self._clicked

clicked = property(get_clicked, set_clicked)

def on_left_down(self, event):

x, y = event.GetPosition()

if self.region.Contains(x, y):

self.clicked = True

def on_left_dclick(self, event):

self.on_left_down(event)

def on_left_up(self, event):

if self.clicked:

x, y = event.GetPosition()

if self.region.Contains(x, y):

self.post_event()

self.clicked = False

def on_motion(self, event):

if self.clicked:

x, y = event.GetPosition()

if not self.region.Contains(x, y):

self.clicked = False

def on_leave_window(self, event):

self.clicked = False

def main():

def on_button(event):

print 'Button was clicked.'

app = wx.PySimpleApp()

frame = wx.Frame(None, -1, 'Shaped Button Demo')

panel = wx.Panel(frame, -1)

button = ShapedButton(panel,

wx.Bitmap('button-normal.png'),

wx.Bitmap('button-pressed.png'),

wx.Bitmap('button-disabled.png'))

button.Bind(wx.EVT_BUTTON, on_button)

sizer = wx.BoxSizer(wx.VERTICAL)

sizer.AddStretchSpacer(1)

sizer.Add(button, 0, wx.ALIGN_CENTER)

sizer.AddStretchSpacer(1)

panel.SetSizer(sizer)

frame.Show()

app.MainLoop()

if __name__ == '__main__':

main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值