2014-01-07 35 views
0

我想通過鼠標移動在位圖頂部繪製一個矩形。但矩形在位圖下呈現。以下是我的代碼。如何在頂層繪製矩形

#!/usr/bin/env python 

import sys, os 
import wx 
import wx.lib.scrolledpanel as scrolled 

class ImgPanel(scrolled.ScrolledPanel): 
    def __init__(self, parent): 
     super(ImgPanel, self).__init__(parent, 
             style = wx.SUNKEN_BORDER) 

     self.bitmap=wx.StaticBitmap(parent=self) 
     image = wx.Bitmap('image.jpg') 
     self.bitmap.SetBitmap(image) 

     self.imgSizer = wx.BoxSizer(wx.VERTICAL)   
     self.imgSizer.Add(self.bitmap, 1, wx.EXPAND) 
     self.SetSizer(self.imgSizer) 

     self.SetAutoLayout(1) 
     self.SetupScrolling()  
     self.Bind(wx.EVT_PAINT, self.OnPaint) 
     self.bitmap.Bind(wx.EVT_MOTION, self.OnMove) 
     self.bitmap.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) 
     self.bitmap.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) 
     self.IsRectReady = False 
     self.newRectPara=[0,0,0,0] 


    def OnMove(self,evt): 
     if True == self.IsRectReady: 
      self.newRectPara[2]=evt.GetPosition()[0]-self.newRectPara[0]+1 
      self.newRectPara[3]=evt.GetPosition()[1]-self.newRectPara[1]+1 
      self.Refresh() 

    def OnLeftDown(self, evt): 
     self.IsRectReady=True 
     self.newRectPara[0]=evt.GetPosition()[0] 
     self.newRectPara[1]=evt.GetPosition()[1] 


    def OnLeftUp(self, evt): 
     self.IsRectReady=False 

    def OnPaint(self, evt):   
     dc=wx.PaintDC(self) 
     dc.Clear() 
     if self.IsRectReady: 
      dc.DrawRectangle(self.newRectPara[0], self.newRectPara[1], 
          self.newRectPara[2], self.newRectPara[3]) 

class WinFrame(wx.Frame): 
    def __init__(self, parent, title, width, height): 
     super(WinFrame, self).__init__(parent, 
             title=title, 
             size=(width, height)) 

     self.imgPanel = ImgPanel(self) 
     self.frameSizer = wx.BoxSizer(wx.HORIZONTAL)   
     self.frameSizer.Add(self.imgPanel, 1, wx.EXPAND)   
     self.SetAutoLayout(True) 
     self.SetSizer(self.frameSizer) 
     self.Layout()  

     self.Centre() 
     self.Show(True)   


class MyApp(wx.App): 
    def __init__(self, width, height): 
     super(MyApp, self).__init__(0) 

     self.width = width 
     self.height = height 

    def createFrame(self): 
     self.frame = WinFrame(None, "test", self.width, self.height) 
     self.SetTopWindow(self.frame)  

def main(): 
    app = MyApp(640, 480) 
    app.createFrame() 
    app.MainLoop() 

if "__main__" == __name__ : 
    main() 
+1

在其他框架中,我一直使用一個容器,它可以容納一個圖像以及一個繪製的矩形(例如畫布)。你不能用這樣的東西嗎? AFAICS認爲'DC'的東西可能總是在圖像下方,所以你的方法將無法工作。 – Alfe

+0

我認爲首先使用'floatcanvas'。但我找不到好的教程。我使用'staticbitmap'小部件進入滾動面板來生成滾動條。我不知道其他方式來渲染一個大圖像,同時可以生成滾動條 – Samuel

回答

2

由於wx.StaticBitmap是一個單獨的(子)窗口,它將始終位於它的父級ImgPanel之上。換句話說,在ImgPanel上完成的任何繪圖將始終位於位圖小部件的後面或下面。如果你想要圖像和圖形進行組合,那麼不要使用wx.StaticBitmap,而應該將位圖添加到EVT_PAINT處理程序中。

+0

你是否應該使用'DC.DrawBitmap'而不是'StaticBitmap'小部件。我已經嘗試過這種方法。但如果圖像比面板大。它無法生成滾動條 – Samuel

+1

使用wx.ScrolledWindow,將窗口的虛擬大小設置爲足夠大以顯示所有圖像,並設置滾動率以設置滾動條將使用的增量。 – RobinDunn

+0

我在框架中有兩個面板。一個面板是用於圖像的。所以我應該在一個框架中使用一個面板和一個滾動窗口。對? – Samuel