2015-07-27 1 views
1

Я пытаюсь создать программу с использованием wxPython, в которой используется ноутбук с вкладками. Я хотел бы установить фон страниц в блокноте на одно изображение. Я думал, что могу просто установить фон wxPanel, содержащий ноутбук, на изображение, а затем настроить страницы на прозрачность, но я не могу найти способ. Единственный способ, с помощью которого я работал, - создать метод OnEraseBackground (найденный в коде ниже) и привязать его к wx.EVT_ERASE_BACKGROUND каждой страницы. Однако это означает, что каждый раз, когда страница рисуется, она перекрашивает один и тот же образ, который является не только пустой тратой вычислительной мощности, но также мигает, когда изображение перекрашивается, что выглядит очень ужасно при использовании. Я ищу предложения о том, как создавать прозрачные страницы для ноутбуков, или если это невозможно, а затем предотвращение перекрашивания. Большое вам спасибо за ваше время. Код:Прозрачная страница ноутбука/Установка фонового изображения для страниц в ноутбуке в wxPython

""" Imports """ 
import os 
import wx 

""" Global Variables """ 
abspath = os.path.abspath(__file__) 
dname = os.path.dirname(abspath) + "/" 
fullscreen = False 

"""" Pages for the tab panel """ 
class Page1(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     t = wx.StaticText(self, -1, "This is a Page1 object", (20,20)) 

class Page2(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     t = wx.StaticText(self, -1, "This is a Page2 object", (20,20)) 

class Page3(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     t = wx.StaticText(self, -1, "This is a Page3 object", (20,20)) 

class Page4(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     t = wx.StaticText(self, -1, "This is a Page4 object", (20,20)) 

class Page5(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     t = wx.StaticText(self, -1, "This is a Page5 object", (20,20)) 

""" Main Panel """ 
class MainPanel(wx.Panel): 
    def __init__(self, parent): 
     # Create the panel 
     wx.Panel.__init__(self, parent) 
     nb = wx.Notebook(self, -1) 

     # Create the pages 
     page1 = Page1(nb) 
     page2 = Page2(nb) 
     page3 = Page3(nb) 
     page4 = Page4(nb) 
     page5 = Page5(nb) 

     # Add the pages to the notebook 
     nb.AddPage(page1, "Page1") 
     nb.AddPage(page2, "Page2") 
     nb.AddPage(page3, "Page3") 
     nb.AddPage(page4, "Page4") 
     nb.AddPage(page5, "Page5") 

     # Layout Management 
     sizer = wx.BoxSizer() 
     sizer.Add(nb, 1, wx.EXPAND) 
     self.SetSizer(sizer) 

     # Add key bindings 
     nb.Bind(wx.EVT_KEY_DOWN, self.onKey) 
     page1.Bind(wx.EVT_KEY_DOWN, self.onKey) 
     page2.Bind(wx.EVT_KEY_DOWN, self.onKey) 
     page3.Bind(wx.EVT_KEY_DOWN, self.onKey) 
     page4.Bind(wx.EVT_KEY_DOWN, self.onKey) 
     page5.Bind(wx.EVT_KEY_DOWN, self.onKey) 

     # Add background bindings 
     page1.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) 
     page2.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) 
     page3.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) 
     page4.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) 
     page5.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) 

    def OnEraseBackground(self, evt): 
     dc = evt.GetDC() 
     if not dc: 
      dc = wx.ClientDC(self) 
      rect = self.GetUpdateRegion().GetBox() 
      dc.SetClippingRect(rect) 
     dc.Clear() 
     bmp = wx.Bitmap(dname + "background.jpg") 
     dc.DrawBitmap(bmp, 0, 0) 

    def onKey(self, event): 
     key_code = event.GetKeyCode() 
     # Toggle FullScreen (F11) 
     if key_code == wx.WXK_F11: 
      global fullscreen 
      fullscreen = not fullscreen 
      self.GetParent().ShowFullScreen(fullscreen) 
     else: 
      event.Skip() 

""" Main Frame """ 
class MainFrame(wx.Frame): 
    def __init__(self): 
     # Frame and panel creation 
     wx.Frame.__init__(self, None, title="Program") 
     self.Maximize(True) 
     panel = MainPanel(self) 

""" Main """ 
if __name__ == "__main__": 
    app = wx.App() 
    MainFrame().Show() 
    app.MainLoop() 

ответ

1

Я бы просто создать отдельный класс панель, которая имеет фоновое изображение в нем. Затем просто подкласс, который для каждой из ваших страниц. Что-то вроде этого:

import wx 

######################################################################## 
class TabPanel(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent) 
     self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) 
     self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) 

    #---------------------------------------------------------------------- 
    def OnEraseBackground(self, evt): 
     """ 
     Add a picture to the background 
     """ 
     # yanked from ColourDB.py 
     dc = evt.GetDC() 

     if not dc: 
      dc = wx.ClientDC(self) 
      rect = self.GetUpdateRegion().GetBox() 
      dc.SetClippingRect(rect) 
     dc.Clear() 
     bmp = wx.Bitmap("/path/to/image.jpg") 
     dc.DrawBitmap(bmp, 0, 0) 

######################################################################## 
class MainPanel(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent) 
     notebook = wx.Notebook(self) 

     tab_one = TabPanel(notebook) 
     notebook.AddPage(tab_one, "Tab One") 

     tab_two = TabPanel(notebook) 
     notebook.AddPage(tab_two, "Tab Two") 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(notebook, 1, wx.ALL|wx.EXPAND, 5) 
     self.SetSizer(sizer) 



######################################################################## 
class MainFrame(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, title="Notebooks") 
     panel = MainPanel(self) 

     self.Show() 

if __name__ == '__main__': 
    app = wx.App(False) 
    frame = MainFrame() 
    app.MainLoop() 
Смежные вопросы