2011-02-02 15 views

Odpowiedz

9

W demo wxPython znajduje się wersja demonstracyjna o kształcie ramki. Przepraszam za pośrednie źródło. Pierwotnie przyszedł jako Instalator Windows here:

source code

Musisz zajrzeć do shaped_frame_mobile.py lub shaped_frame.py, która zarówno wezwanie images.py z tej aukcji dla okna próbki bitmapy. Nie jest to dokładny odpowiednik overrideredirect, ponieważ będziesz musiał dostarczyć obrazek do narysowania dla ramki, ale nadal może ci pomóc osiągnąć coś podobnego.

ważne części są funkcje, które wyznaczają kształt okien na podstawie bitmapy i obsłużyć zdarzenia wx.EVT_PAINT:

def SetWindowShape(self, evt=None): 
    r = wx.RegionFromBitmap(self.bmp) 
    self.hasShape = self.SetShape(r) 

def OnPaint(self, evt): 
    dc = wx.PaintDC(self) 
    dc.DrawBitmap(self.bmp, 0,0, True) 

Edycja - Oto zmienione shaped_frame_mobile.py który ładuje obraz .png określonej w IMAGE_PATH zmienna. Zmień to, aby wskazywało na swoje zdjęcie:

import wx 

# Create a .png image with something drawn on a white background 
# and put the path to it here. 
IMAGE_PATH = '/python26/projects/shapedwin/image.png' 


class ShapedFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, "Shaped Window", 
       style = wx.FRAME_SHAPED | wx.SIMPLE_BORDER) 
     self.hasShape = False 
     self.delta = wx.Point(0,0) 

     # Load the image 
     image = wx.Image(IMAGE_PATH, wx.BITMAP_TYPE_PNG) 
     image.SetMaskColour(255,255,255) 
     image.SetMask(True)    
     self.bmp = wx.BitmapFromImage(image) 

     self.SetClientSize((self.bmp.GetWidth(), self.bmp.GetHeight())) 
     dc = wx.ClientDC(self) 
     dc.DrawBitmap(self.bmp, 0,0, True) 
     self.SetWindowShape() 
     self.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick) 
     self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) 
     self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) 
     self.Bind(wx.EVT_MOTION, self.OnMouseMove) 
     self.Bind(wx.EVT_RIGHT_UP, self.OnExit) 
     self.Bind(wx.EVT_PAINT, self.OnPaint) 
     self.Bind(wx.EVT_WINDOW_CREATE, self.SetWindowShape) 

    def SetWindowShape(self, evt=None): 
     r = wx.RegionFromBitmap(self.bmp) 
     self.hasShape = self.SetShape(r) 

    def OnDoubleClick(self, evt): 
     if self.hasShape: 
      self.SetShape(wx.Region()) 
      self.hasShape = False 
     else: 
      self.SetWindowShape() 

    def OnPaint(self, evt): 
     dc = wx.PaintDC(self) 
     dc.DrawBitmap(self.bmp, 0,0, True) 

    def OnExit(self, evt): 
     self.Close() 

    def OnLeftDown(self, evt): 
     self.CaptureMouse() 
     pos = self.ClientToScreen(evt.GetPosition()) 
     origin = self.GetPosition() 
     self.delta = wx.Point(pos.x - origin.x, pos.y - origin.y) 

    def OnMouseMove(self, evt): 
     if evt.Dragging() and evt.LeftIsDown(): 
      pos = self.ClientToScreen(evt.GetPosition()) 
      newPos = (pos.x - self.delta.x, pos.y - self.delta.y) 
      self.Move(newPos) 

    def OnLeftUp(self, evt): 
     if self.HasCapture(): 
      self.ReleaseMouse() 



if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    ShapedFrame().Show() 
    app.MainLoop() 
+0

Dzięki, chociaż odwołuje się do modułu "images". Nie jestem do końca pewien, który to moduł. Czy masz jakąś wskazówkę? – rectangletangle

+0

To plik 'images.py' z powyższego linku źródłowego. Możesz albo przenieść go do tego samego katalogu, co inne, albo pozbyć się "importowania obrazów" i załadować swoją własną bitmapę zamiast linii 'images.getVippiBitmap()'. Nie wiem, dlaczego wersja demonstracyjna używa modułu Pythona do dostarczenia obrazu. –

+0

@ Anteater7171 Dodałem zmieniony kod do mojej odpowiedzi. Łatwiej pokazać, niż wytłumaczyć. –

Powiązane problemy