如何在wxpython中使wx.statictext文本透明

时间:2017-06-22 03:06:51

标签: python wxpython

# -*- coding: utf-8 -*-
import wx, wx.media
import sqlite3
import os
import time

class MainFream(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        self.leftPanel = wx.Panel(self, size=(0,0))
        self.media = wx.media.MediaCtrl(self,
                                        #szBackend=wx.media.MEDIABACKEND_GSTREAMER,
                                        szBackend=wx.media.MEDIABACKEND_WMP10,
                                        size = (0,0),
                                        style = wx.SIMPLE_BORDER)
        image = wx.Image('1.bmp', wx.BITMAP_TYPE_BMP).ConvertToBitmap()
        self.background = wx.StaticBitmap(self.leftPanel, 0, image, (0,0))


        self.hBoxSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.hBoxSizer.Add(self.leftPanel, 1, wx.ALL|wx.EXPAND, 5)
        self.hBoxSizer.Add(self.media, 1, wx.ALL|wx.EXPAND, 5)
        self.SetSizer(self.hBoxSizer)

        self.conn = sqlite3.connect("test.db")
        self.cursor = self.conn.cursor()

        self.mediaCounter = 0
        self.folderSerach = [f for f in os.listdir() if f.endswith(('.mpg', '.jpg', '.wmv'))]
        self.media.Bind(wx.media.EVT_MEDIA_LOADED, self.mediaPlay, self.media)
        self.media.Bind(wx.media.EVT_MEDIA_FINISHED, self.mediaLoop, self.media)
        self.media.Load(self.folderSerach[self.mediaCounter])

        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.autoRefresh, self.timer)
        self.timer.Start(10000)

        self.Text()
        self.LoadText()
        self.TextSizer()

    def autoRefresh(self, event):
        self.LoadText()

    def mediaPlay(self, event):
        if self.folderSerach[self.mediaCounter].endswith('jpg'):
            self.media.Play()
            #time.sleep(10)
        else:
            self.media.Play()

    def mediaLoop(self, evnet):
        self.media.Stop()
        self.mediaCounter += 1
        print(self.folderSerach)
        if self.mediaCounter > len(self.folderSerach) -1: self.mediaCounter = 0
        self.media.Load(self.folderSerach[self.mediaCounter])

    def Text(self):
        self.title = TransparentText(self.leftPanel, label='test title', style=wx.EXPAND)

        self.staticText1_1 = TransparentText(self.leftPanel, label="test1", style=wx.ALIGN_CENTER)
        self.staticText1_2 = TransparentText(self.leftPanel, label="test2", style=wx.ALIGN_CENTER)
        self.staticText1_3 = TransparentText(self.leftPanel, label="test3", style=wx.ALIGN_CENTER)
        self.staticText1_4 = TransparentText(self.leftPanel, label="test4", style=wx.ALIGN_CENTER)
        self.staticText1_5 = TransparentText(self.leftPanel, label="test5", style=wx.ALIGN_CENTER)
        self.staticText1_6 = TransparentText(self.leftPanel, label="test6", style=wx.ALIGN_CENTER)

        self.staticText2_1 = TransparentText(self.leftPanel, style=wx.ALIGN_CENTER)
        self.staticText2_2 = TransparentText(self.leftPanel, style=wx.ALIGN_CENTER)
        self.staticText2_3 = wx.StaticText(self.leftPanel, style=wx.ALIGN_CENTER)
        self.staticText2_4 = wx.StaticText(self.leftPanel, style=wx.ALIGN_CENTER)
        self.staticText2_5 = wx.StaticText(self.leftPanel, style=wx.ALIGN_CENTER)
        self.staticText2_6 = wx.StaticText(self.leftPanel, style=wx.ALIGN_CENTER)

    def LoadText(self):
        self.cursor.execute("SELECT *FROM CLINIC1")
        for data1 in self.cursor.fetchall(): pass
        self.staticText2_1.SetLabel(data1[1])
        self.staticText2_2.SetLabel(data1[2])
        self.staticText2_3.SetLabel(data1[3])
        self.staticText2_4.SetLabel(data1[4])
        self.staticText2_5.SetLabel(data1[5])
        self.staticText2_6.SetLabel(data1[6])

    def TextSizer(self):
        self.gridSizer = wx.GridSizer(3, 6, 0, 5)
        self.textSizers = (
            self.staticText1_1, self.staticText1_2, self.staticText1_3,
            self.staticText1_4, self.staticText1_5, self.staticText1_6,
            self.staticText2_1, self.staticText2_2, self.staticText2_3,
            self.staticText2_4, self.staticText2_5, self.staticText2_6,
        )
        for textSizer in self.textSizers:
            self.gridSizer.Add(textSizer, 0, wx.ALL|wx.ALIGN_CENTER, 1)
        self.vttextSizer = wx.BoxSizer(wx.VERTICAL)
        self.vttextSizer.Add(self.title, 0, wx.ALL|wx.ALIGN_CENTER|wx.TOP, 1)
        self.vttextSizer.Add(self.gridSizer, 1, wx.ALL|wx.ALIGN_CENTER, 1)
        self.leftPanel.SetSizer(self.vttextSizer)

class TransparentText(wx.StaticText):
    def __init__(self, parent, id=wx.ID_ANY, label='', pos=wx.DefaultPosition,
                 size=wx.DefaultSize, style=wx.TRANSPARENT_WINDOW, name=''):
        wx.StaticText.__init__(self, parent, id, label, pos, size, style, name)

        self.Bind(wx.EVT_PAINT, self.on_paint)
        self.Bind(wx.EVT_ERASE_BACKGROUND, lambda event: None)
        self.Bind(wx.EVT_SIZE, self.on_size)

    def on_paint(self, event):
        bdc = wx.PaintDC(self)
        dc = wx.GCDC(bdc)

        font_face = self.GetFont()
        font_color = self.GetForegroundColour()

        dc.SetFont(font_face)
        dc.SetTextForeground(font_color)
        dc.DrawText(self.GetLabel(), 0, 0)

    def on_size(self, event):
        self.Refresh()
        event.Skip()

if __name__ == '__main__':
    app = wx.App()
    fream = MainFream()
    fream.Show(True)
    app.MainLoop()

enter image description here 我在背景后面使文字字母透明。问题是,如果您自动更新,透明部分会像附加图片一样消失。

使用wx.CallLater的结果相同。我的代码有问题吗? 我不知道为什么。叠加现象?

0 个答案:

没有答案