5 Apr 2013

Python+wxpython创建不规则窗体

收藏到CSDN网摘
网上看到的一段代码,很简洁.创建不规则窗体.例如(实际运行不会看到白色部分,下面的效果跟网页背景有关):


下载文件,保存为bg.png,跟py文件放在同一路径下,直接运行即可(必须已经安装wxpython)
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sys

reload(sys)
sys.setdefaultencoding("utf-8")

import wx
import os.path

class MyFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self,parent=None,id=-1,title="不规则窗体",pos=(100,100),style=wx.FRAME_SHAPED|wx.SIMPLE_BORDER|wx.STAY_ON_TOP)

        self.pt = wx.Point(0,0)
        img = wx.Image(os.path.sep.join([os.path.curdir,'bg.png']))
        img.SetMask(True)
        img.SetMaskColour(255,255,255)
        self.bg = wx.BitmapFromImage(img)
        self.SetSize(wx.Size(self.bg.GetWidth(),self.bg.GetHeight()))
        self.hasShape = False
        self.OnWindowCreate()

        self.Bind(wx.EVT_RIGHT_UP,self.OnRightClickEvent)
        self.Bind(wx.EVT_WINDOW_CREATE,self.OnWindowCreate)
        self.Bind(wx.EVT_LEFT_DOWN,self.OnLeftClickDown)
        self.Bind(wx.EVT_LEFT_UP,self.OnLeftClickUp)
        self.Bind(wx.EVT_MOTION,self.OnMouseMotion)
        self.Bind(wx.EVT_PAINT,self.OnPaint)

    def OnRightClickEvent(self,event):
        if wx.MessageBox("退出?","退出",wx.YES_NO,self) == 2:
            wx.Exit()

    def OnLeftClickDown(self,event):
        self.CaptureMouse()
        pos =  event.GetPosition()
        self.pt = wx.Point(pos.x,pos.y)

    def OnMouseMotion(self,event):
        if event.Dragging() and event.LeftIsDown():
            pos = self.ClientToScreen(event.GetPosition())
            self.Move((pos.x-self.pt.x,pos.y-self.pt.y))

    def OnLeftClickUp(self,event):
        if self.HasCapture():
            self.ReleaseMouse()

    def OnWindowCreate(self,event=None):
        r = wx.RegionFromBitmap(self.bg)
        self.SetShape(r)

    def OnPaint(self,event):
        dc = wx.PaintDC(self)
        dc.DrawBitmap(self.bg,0,0,True)

class MyApp(wx.App):

    def OnInit(self):
        self.frame = MyFrame()
        self.frame.Show(True)
        self.SetTopWindow(self.frame)
        return True

if __name__ == "__main__":
    app = MyApp()
    app.MainLoop()

No comments :

Post a Comment