wxPython和pycairo练习记录13

wxpython绘制圆角窗体 主要为大家详细介绍了wxpython绘制圆角窗体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 立即下载

实现更美观的滚动字幕效果

之前虽然通过设置窗口样式去掉了标题栏,但是背景看起来还是有些碍眼。通过 SetTransparent 只能调整整体透明度,文字和背景都透明了。希望实现的效果是背景透明,而文字不透明。

透明背景的文字窗体

wxPython demo 中有两个实现形状窗口的例子,ShapedWindow 和 AdvancedSplash,其实都是通过 SetShape(wx.Region) 实现的。region 翻译为区域,不太理解,还有另一个签名 SetShape(wx.GraphicsPath),所以实际是设置像 PS 里的路径?

没有找到怎么用文字来设置形状,所以把文字先转为图像。通过 wx.GraphicsContext 创建透明背景文字 Bitmap,把图像设置为 Frame 的 shape。显示文字会有明显锯齿,且当字体设置较小时,文字周围会有黑边。

在 OnPaint 中绘制一个文字颜色的同窗口大小的矩形,文字黑边消失。后绘制的矩形是显示在文字上层,文字图片变成蒙版了?

效果:
在这里插入图片描述

源码:

# -*- coding: utf-8 -*-
import wx


class MyFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(MyFrame, self).__init__(*args, **kwargs)
        self.Center()

        w, h = self.GetSize()
        self.bg = wx.Bitmap.FromRGBA(w, h)
        dc = wx.MemoryDC(self.bg)
        gc = wx.GraphicsContext.Create(dc)

        font = wx.Font(32, family=wx.SWISS, style=wx.NORMAL, weight=wx.BOLD, faceName=u"宋体")
        gc.SetFont(font, "#ff0000")
        gc.DrawText(u"你好,世界!Hello World!😍", 0, 0)  # emoji 不能显示

        region = wx.Region(self.bg, wx.TransparentColour)
        self.SetShape(region)

        self.Bind(wx.EVT_PAINT,self.onPaint)

        self.SetTransparent(150)

    def onPaint(self, evt):
        dc= wx.PaintDC(self)
        dc.DrawBitmap(self.bg, 0, 0, True)
        dc.SetBrush(wx.Brush(wx.RED))
        dc.DrawRectangle(0, 0, *self.GetSize())


app = wx.App()
frame = MyFrame(parent=None,
                size=(1075, 53),
                style=wx.FRAME_SHAPED | wx.NO_BORDER | wx.STAY_ON_TOP | wx.TRANSPARENT_WINDOW)
frame.Show()
app.MainLoop()

还有一种方法,直接通过 wx.ScreenDC 在电脑屏幕上任意位置绘制文字,不需要交互的话应该是可以的。脱离了程序窗口,如果和鼠标、键盘交互,要怎么处理呢?

锯齿问题待解决,使用 SetAntialiasMode 方法设置没有效果。抗锯齿参考帖子 https://discuss.wxpython.org/t/anti-aliased-text-with-wx-graphicscontext/25021/27

wx.GraphicsContext wraps GDI+, which is a system API, so it is still dependent on the system settings for AA. You could try using wx.lib.graphics.GraphicsContext instead, it uses Cairo on all the platforms instead of the native APIs.
来源:https://discuss.wxpython.org/t/anti-aliased-text-with-wx-graphicscontext/25021/4

大略就是自带的 GDI 是调用系统 API,需要使用优化的第三方库。后续再尝试。

整合滚动字幕

向歌词工具进发?下面是某音乐播放器的歌词显示效果。SetShape 方法传递一个空的 wx.Region 就能使原本的矩形窗口显示出来,可以用来实现歌词的鼠标移入移出效果。文字描边怎么实现的?还是先继续整合滚动弹幕吧。
在这里插入图片描述

wx.lib.ticker.Ticker 类是继承自 wx.Control , 而 SetShape 方法是继承自 wx.NonOwnedWindow,不能作用于 Ticker。直接继承 wx.Frame 重写 Ticker 控件?好像并不需要做很大改动,直接把基类改一下就能用。

还有些待完善:1.多线程用法;2.清空形状图像(如果用 wx.GCDC 的 Clear 也会显示矩形窗体);3.文字窗体用鼠标点击时,文字镂空范围是选择不到的,需要歌词那样的效果。

在这里插入图片描述

源码:

# -*- coding: utf-8 -*-
# Author: SmileBasic
import threading
import wx
import ticker


class Ticker(ticker.Ticker):
    def __init__(self, *args, **kwargs):
        self._text = []  # 滚动字符串存储列表,格式[[字符串尺寸, 字符串], [(56, 22), "test"]]
        self._text_max = 500  # _text 最大可存储字符串数量
        self._gap = 0  # 滚动字符串之间间距
        self._gap_pixels = 0
        self._index = 0  # 显示字符串头节点
        self._num = 1  # 显示字符串数量
        self._dc = wx.MemoryDC()  # 用于获取文本尺寸

        super(Ticker, self).__init__(*args, **kwargs)

        self.Center()
        self._bg = wx.Bitmap.FromRGBA(*self.GetSize())
        self._gc = wx.GraphicsContext.Create(wx.MemoryDC(self._bg))
        self._fgcolor = kwargs["fgcolor"]
        self._gc.SetFont(self.GetFont(), self._fgcolor)
        # 需要一个初始形状,不然会显示原矩形窗体
        self._gc.DrawText("SmileBasic", 0, 0)
        region = wx.Region(self._bg, wx.TransparentColour)
        self.SetShape(region)

        self.Bind(wx.EVT_RIGHT_UP, self.OnClose)
        self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
        self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
        self.Bind(wx.EVT_MOTION, self.OnMouseMove)

    def SetFont(self, font):
        """设置控件使用的字体"""
        wx.Frame.SetFont(self, font)
        self._dc.SetFont(font)
        self._gc.SetFont(font, self._fgcolor)
        self.SetGap(self._gap)
        # 更新存储文本尺寸
        for text in self._text:
            text[0] = self._dc.GetTextExtent(text[1])

    def SetText(self, text):
        """将字符串插入滚动字符串列表尾部"""
        if text.strip():
            lens = len(self._text)
            if lens >= self._text_max:
                if self._index != 0:
                    self._text = self._text[self._index % lens:]
                    self._index = 0
                else:
                    self._text.pop(0)
            size = self._dc.GetTextExtent(text)
            self._text.append([size, text])
            self.Refresh()

    def SetGap(self, gap):
        """设置字符串显示间距"""
        self._gap = gap
        self._gap_pixels = self._dc.GetTextExtent(self._gap * " ")[0]

    def UpdateExtent(self, dc):
        """更新字符串尺寸"""
        pass

    def OnTick(self, evt):
        """更新滚动文字坐标"""
        if not self._text:
            return
        self._offset += self._ppf  # offset 偏移,ppf(pixels per frame) 每帧滚动的像素
        # 头节点滚出显示区
        w1 = self.GetSize()[0]
        w2 = self._text[self._index][0][0]
        if self._offset >= w1 + w2:
            self._offset = self._offset - w2 - self._gap_pixels
            self._index = (self._index + 1) % len(self._text)
            self._num -= 1
        # 尾节点与显示区尾部相距超过指定间距
        w3 = sum([self._text[i % len(self._text)][0][0] for i in range(self._index, self._index + self._num)])
        w3 = w3 + self._gap_pixels * self._num
        if self._offset >= w3:
            self._num += 1
        self.Refresh()

    def OnPaint(self, evt):
        """PAINT事件处理"""
        dc = wx.BufferedPaintDC(self)
        brush = wx.Brush(self.GetBackgroundColour())
        dc.SetBackground(brush)
        dc.Clear()
        dc.DrawBitmap(self._bg, 0, 0, True)
        dc.SetBrush(wx.Brush(self._fgcolor))
        dc.DrawRectangle(0, 0, *self.GetSize())
        self.DrawText(dc)

    def DrawText(self, dc):
        """绘制滚动文字"""
        if not self._text or self._offset <= 0:
            return
        # 笨办法重置 bitmap
        self._bg = wx.Bitmap.FromRGBA(*self.GetSize())
        self._gc = wx.GraphicsContext.Create(wx.MemoryDC(self._bg))
        self._gc.SetFont(self.GetFont(), self._fgcolor)
        if self._dir == "ltr":
            offx = self._offset - self._text[self._index][0][0]
            fix_dir = -1
            fix_size = 1
        else:
            offx = self.GetSize()[0] - self._offset
            fix_dir = 1
            fix_size = 0
        lens = len(self._text)
        for i in range(self._index, self._index + self._num):
            offy = (self.GetSize()[1] - self._text[i % lens][0][1]) / 2
            self._gc.DrawText(self._text[i % lens][1], offx, offy)
            if i < self._index + self._num - 1:
                offx = offx + self._text[(i + fix_size) % lens][0][0] * fix_dir + self._gap_pixels * fix_dir
        region = wx.Region(self._bg, wx.TransparentColour)
        # SetShape 会阻塞主线程
        # wx.CallAfter(self.SetShape, region)
        t = threading.Thread(target=wx.CallAfter, args=(self.SetShape, region))
        t.start()

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

    def OnLeftDown(self, evt):
        self.CaptureMouse()
        x, y = self.ClientToScreen(evt.GetPosition())
        originx, originy = self.GetPosition()
        dx = x - originx
        dy = y - originy
        self.delta = ((dx, dy))

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

    def OnMouseMove(self, evt):
        if evt.Dragging() and evt.LeftIsDown():
            x, y = self.ClientToScreen(evt.GetPosition())
            fp = (x - self.delta[0], y - self.delta[1])
            self.Move(fp)


class App(wx.App):
    def OnInit(self):
        tk = Ticker(parent=None, id=-1, text="你好,世界!Hello World!",
                    fgcolor="#ff0000", bgcolor="#ffff00", start=True,
                    ppf=2, fps=20, direction="rtl",
                    size=(1075, 53),
                    style=wx.FRAME_SHAPED | wx.NO_BORDER | wx.STAY_ON_TOP | wx.TRANSPARENT_WINDOW,
                    name="Ticker")
        tk.SetFont(wx.Font(24, family=wx.SWISS, style=wx.NORMAL, weight=wx.BOLD, faceName=u"宋体"))
        tk.SetGap(5)
        tk.SetText("优快云")
        tk.SetText("SmileBasic")
        tk.Start()
        tk.Show()

        return True

    def OnExit(self):
        return 0


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

# ticker.py
#----------------------------------------------------------------------
# Name:        wx.lib.ticker
# Purpose:     A news-ticker style scrolling text control
#
# Author:      Chris Mellon
#
# Created:     29-Aug-2004
# Copyright:   (c) 2004 by Chris Mellon
# Licence:     wxWindows license
# Tags:        phoenix-port, unittest, documented, py3-port
#----------------------------------------------------------------------

"""
News-ticker style scrolling text control

    * Can scroll from right to left or left to right.

    * Speed of the ticking is controlled by two parameters:

      - Frames per Second(FPS): How many times per second the ticker updates

      - Pixels per Frame(PPF): How many pixels the text moves each update

Low FPS with high PPF will result in "jumpy" text, lower PPF with higher FPS
is smoother (but blurrier and more CPU intensive) text.
"""

import wx

#----------------------------------------------------------------------

class Ticker(wx.Frame):
    def __init__(self,
            parent,
            id=-1,
            text=wx.EmptyString,
            fgcolor = wx.BLACK,
            bgcolor = wx.WHITE,
            start=True,
            ppf=2,
            fps=20,
            direction="rtl",
            pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.NO_BORDER,
            name="Ticker"
        ):
        """
        Default class constructor.

        :param wx.Window `parent`: the parent
        :param integer `id`: an identifier for the control: a value of -1 is taken to mean a default
        :param string `text`: text in the ticker
        :param wx.Colour `fgcolor`: text/foreground color
        :param wx.Colour `bgcolor`: background color
        :param boolean `start`: if True, the ticker starts immediately
        :param int `ppf`: pixels per frame
        :param int `fps`: frames per second
        :param `direction`: direction of ticking, 'rtl' or 'ltr'
        :param wx.Point `pos`: the control position. A value of (-1, -1) indicates a default position,
         chosen by either the windowing system or wxPython, depending on platform
        :param `name`: the control name

        """
        wx.Frame.__init__(self, parent, id=id, pos=pos, size=size, style=style, name=name)
        self.timer = wx.Timer(owner=self)
        self._extent = (-1, -1)  #cache value for the GetTextExtent call
        self._offset = 0
        self._fps = fps  #frames per second
        self._ppf = ppf  #pixels per frame
        self.SetDirection(direction)
        self.SetText(text)
        self.SetInitialSize(size)
        self.SetForegroundColour(fgcolor)
        self.SetBackgroundColour(bgcolor)
        self.Bind(wx.EVT_TIMER, self.OnTick)
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnErase)
        if start:
            self.Start()


    def Stop(self):
        """Stop moving the text"""
        self.timer.Stop()


    def Start(self):
        """Starts the text moving"""
        if not self.timer.IsRunning():
            self.timer.Start(1000 // self._fps)


    def IsTicking(self):
        """Is the ticker ticking? ie, is the text moving?"""
        return self.timer.IsRunning()


    def SetFPS(self, fps):
        """
        Adjust the update speed of the ticker.

        :param int `fps`: frames per second.

        """
        self._fps = fps
        self.Stop()
        self.Start()


    def GetFPS(self):
        """
        Get the frames per second speed of the ticker.
        """
        return self._fps


    def SetPPF(self, ppf):
        """
        Set the number of pixels per frame the ticker moves - ie,
        how "jumpy" it is.

        :param int `ppf`: the pixels per frame setting.

        """
        self._ppf = ppf


    def GetPPF(self):
        """Get pixels per frame setting."""
        return self._ppf


    def SetFont(self, font):
        """
        Set the font for the control.

        :param wx.Font `font`: the font to be used.

        """
        self._extent = (-1, -1)
        wx.Control.SetFont(self, font)


    def SetDirection(self, dir):
        """
        Sets the direction of the ticker: right to left (rtl) or
        left to right (ltr).

        :param `dir`: the direction 'rtl' or 'ltr'

        """
        if dir == "ltr" or dir == "rtl":
            if self._offset != 0:
                #Change the offset so it's correct for the new direction
                self._offset = self._extent[0] + self.GetSize()[0] - self._offset
            self._dir = dir
        else:
            raise TypeError


    def GetDirection(self):
        """Get the set direction."""
        return self._dir


    def SetText(self, text):
        """
        Set the ticker text.

        :param string `text`: the ticker text

        """
        self._text = text
        self._extent = (-1, -1)
        if not self._text:
            self.Refresh() #Refresh here to clear away the old text.


    def GetText(self):
        """Get the current ticker text."""
        return self._text


    def UpdateExtent(self, dc):
        """
        Updates the cached text extent if needed.

        :param wx.DC `dc`: the dc to use.

        """
        if not self._text:
            self._extent = (-1, -1)
            return
        if self._extent == (-1, -1):
            self._extent = dc.GetTextExtent(self.GetText())


    def DrawText(self, dc):
        """
        Draws the ticker text at the current offset using the provided DC.

        :param wx.DC `dc`: the dc to use.

        """
        dc.SetTextForeground(self.GetForegroundColour())
        dc.SetFont(self.GetFont())
        self.UpdateExtent(dc)
        if self._dir == "ltr":
            offx = self._offset - self._extent[0]
        else:
            offx = self.GetSize()[0] - self._offset
        offy = (self.GetSize()[1] - self._extent[1]) / 2 #centered vertically
        dc.DrawText(self._text, int(offx), int(offy))


    def OnTick(self, evt):
        """
        Handles the ``wx.EVT_TIMER`` event for :class:`Ticker`.

        :param `evt`: a :class:`TimerEvent` event to be processed.

        """
        self._offset += self._ppf
        w1 = self.GetSize()[0]
        w2 = self._extent[0]
        if self._offset >= w1+w2:
            self._offset = 0
        self.Refresh()


    def OnPaint(self, evt):
        """
        Handles the ``wx.EVT_PAINT`` event for :class:`Ticker`.

        :param `evt`: a :class:`PaintEvent` event to be processed.

        """
        dc = wx.BufferedPaintDC(self)
        brush = wx.Brush(self.GetBackgroundColour())
        dc.SetBackground(brush)
        dc.Clear()
        self.DrawText(dc)


    def OnErase(self, evt):
        """
        Noop because of double buffering

        Handles the ``wx.EVT_ERASE_BACKGROUND`` event for :class:`Ticker`.

        :param `evt`: a :class:`EraseEvent` event to be processed.

        """
        pass


    def AcceptsFocus(self):
        """Non-interactive, so don't accept focus"""
        return False


    def DoGetBestSize(self):
        """
        Width we don't care about, height is either -1, or the character
        height of our text with a little extra padding
        """
        if self._extent == (-1, -1):
            if not self._text:
                h = self.GetCharHeight()
            else:
                h = self.GetTextExtent(self.GetText())[1]
        else:
            h = self._extent[1]
        return (100, h+5)


    def ShouldInheritColours(self):
        """Don't get colours from our parent."""
        return False



#testcase/demo
if __name__ == '__main__':
    app = wx.App()
    t = Ticker(None, text="Some sample ticker text", size=(1070, 50))
    t.Center()
    t.Show()
    app.MainLoop()


既然已经大致实现了透明背景动画效果窗体,那么做个桌面宠物也是可以的吧。桌面水印、抢购计时…以后再试试。

新的问题,滚动字幕通过视频号工具,添加窗口播放源会有黑色背景,添加进程则整个窗口都不显示,添加桌面倒是可以,但也不适合。
在这里插入图片描述

安装 pywin32 库,试试通过 AssociateHandle 关联其他程序窗口,获取并使用它的 DC。但是对系统的记事本有作用,对小程序没有影响。而且使用 dc.Clear 会影响原内容,不使用则在移动窗口时会显示历史文字。
在这里插入图片描述

# -*- coding: utf-8 -*-
import win32gui
import wx


class MyFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(MyFrame, self).__init__(*args, **kwargs)
        hld = win32gui.FindWindow(None, u"批量发文.txt - 记事本")
        print(hld)
        self.AssociateHandle(hld)

        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnErase)

        self.timer = wx.Timer(owner=self)
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
        self.timer.Start(100)

    def OnErase(self, event):
        pass

    def Draw(self, dc):
        w, h = self.GetClientSize()
        print(w, h)
        x, y = self.GetPosition()
        print(x, y)
        strs = "你好,世界!Hello World!"
        dc.SetTextForeground(wx.RED)
        dc.SetFont(wx.Font(32, wx.SWISS, wx.NORMAL, wx.BOLD))
        tw, th = dc.GetTextExtent(strs)
        dc.DrawText(strs, (w - tw) // 2, (h - th) // 2)

    def OnTimer(self, evt):
        dc = wx.ClientDC(self)
        # dc.Clear()
        self.Draw(dc)

    def OnPaint(self, evt):
        dc = wx.PaintDC(self)
        dc.Clear()
        self.Draw(dc)


app = wx.App()
frame = MyFrame(parent=None)
frame.Show()
app.MainLoop()

所以,不懂的太多了,还是向有背景方向美化吧。两种美化效果参考:一种是LED滚动显示屏,一种是比特小队游戏里的商店滚动屏。

WxPython实现无边框界面 主要为大家详细介绍了WxPython实现无边框界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 立即下载

相关推荐

python用WxPython库实现无边框窗体和透明窗体实现方法详解

wxPython是Python语言的一套优秀的GUI图形库。允许Python程序员很方便的创建完整的、功能键全的GUI用户界面。 wxPython是作为优秀的跨平台GUI库wxWidgets的Python封装和Python模块的方式提供给用户的。 下面的2个实例代码是实现wxPython窗体特殊效果演示大家可以研究下 wxPython无边框窗体实现代码如下: import wx class Frame(wx.Frame): def __init__(self):#,pos=(0,0) wx.Frame.__init__(self,None,title = u"",pos=(10,10)

wxpython实现透明无边框面板

网上找了很多例子都不可行,最后根据官方例子改的,需要通过wxApp来调用设置透明度才生效 import wx # !/usr/bin/env python # coding:utf-8 from wx import * class Frame(wx.Frame): def __init__(self, *args, **kwargs): super(Frame, self).__init__(*args, **kwargs, style=wx.NO_BORDER | wx

qiuyuan 1120

从VoLTE高清通话到5G新通话:手把手带你用Wireshark抓包分析QCI 1, 2, 5, 9的建立与切换过程

本文详细解析了从VoLTE高清通话到5G新通话的QCI(QoS Class Identifier)建立与切换过程,通过Wireshark抓包实战演示如何分析QCI 1、2、5、9的承载机制。内容涵盖QCI基础概念、实验环境搭建、VoLTE通话建立过程分析以及5G新通话中的QoS演进,为网络工程师和通信技术爱好者提供实用的技术指南和优化建议。

weixin_30788619的博客 342

wxpython界面美化之 wx.Frame透明背景 及Statictext控件的背景色隐藏

综述: 在利用wxpython写的GUI的时候,我们为一般界面添加美化的,但是在为界面背景添加图片背景时,可以发现控件Statictext上的字体自带背景;被放置在背景图片的上面,甚是难看。 在控件panel上放置背景图片,并使整个生成的界面透明化: import wx import wx.lib.buttons as buttons class Frame(wx.Frame): ...

Alfie的博客 7219

清华电子系保研面试全记录:五轮硬核考核+工程硕博专项解析(附真题)

本文详细解析了清华大学电子工程系保研面试的完整流程,重点剖析了其标志性的五轮专业面试(涵盖电路、电磁场、信号系统、计算机与AI)和综合组群面,并深入解读了工程硕博改革专项的考核要点与备战策略。文章提供了各专业组的真题示例与应对方法,旨在帮助电子信息相关专业学子系统准备,从容应对这场高强度的知识与综合素质挑战。

u0v1w2x3的博客 588

HSMS/SECS/GEM/GEM300半导体通讯协议介绍

HSMS/SECS/GEM/GEM300半导体通讯协议解决方案介绍 目录 SECS/GEM协议通讯 1 目录 2 1.介绍 3 1.1 产品概述 3 1.1.1 高扩展性 4 1.2 通讯实现 4 1.2.2多主机实现 4 1.3 当前的SEMI标准 5 1.3.1 功能跟友商对比 6 1.4 软件灵活性 7 1.5 无需学习SECS 7 1.6 自定义消息传递 8 1.7 记录收集 8 1.8 SECS Manual文档 8 1.9 产品清单 8 2 产品结构 9 2.1 控制面板 9 2.2 使用环境

semisecs 16万+

wxPython 窗口实现透明

#!/usr/bin/env python #coding:utf-8 from wx import * class Trans(Frame): def __init__(self, parent, id, title): Frame.__init__(self, parent, id, title, size=(700, 500), style=DEFAULT_FRA

技术皮皮虾 8263

深入解析SSD报错“READ FPDMA QUEUED”:从诊断到修复全流程

本文深入解析了SSD报错“READ FPDMA QUEUED”的含义、成因与全流程解决方案。该错误通常指示硬盘硬件或健康状态问题。文章详细介绍了如何通过系统日志定位错误、解读关键的S.M.A.R.T.健康报告(重点关注重分配扇区计数等指标),并逐步进行硬件排查(如更换SATA数据线)、软件修复与数据抢救,最终指导用户根据诊断结果做出维修或更换SSD的决策。

weixin_29233333的博客 400

wxPython和pycairo练习记录17

按理说素材图片虽然是位图但因为是纯色,手动缩放显示都没问题,不知道为什么会这样,网上解释说是"Cairo 默认使用线性插值算法进行缩放操作,而线性插值会导致图像像素的颜色被平滑地混合,从而造成图像的模糊效果。不要当过程完美主义者,很容易自我攻击。素材中的 characters.gif,用 wx.Image 加载后,调用 GetAlpha 方法发现得到不正确的透明通道值,而且 HasAlpha 得到的结果是 False,因为没有正确解释透明通道数据,RGB 数据也错了,加载后整个图片都变成了粉色。

SmileBasic的博客 897

CH340驱动安装全攻略:从Windows到MacOS的避坑指南(2025最新版)

本文提供2025年最新版CH340驱动安装全攻略,涵盖Windows、MacOS和Linux三大操作系统。详细解析了驱动安装的核心原理、标准流程,并针对Windows设备管理器报错、MacOS系统安全限制等常见“坑点”提供了深度排错与解决方案,旨在帮助开发者快速稳定地完成USB转串口通信配置。

earth的博客 428

从SIGGRAPH审稿人视角看:什么样的TOG论文更容易被接收?

本文从SIGGRAPH审稿人视角深入解析TOG论文的审稿标准与投稿策略,揭示如何提升论文接收概率。重点探讨创新性、技术深度、实验验证等核心评分维度,并提供写作技巧与审稿意见应对策略,帮助研究者优化ACM Transactions on Graphics投稿质量。

weixin_33721344的博客 109

wxpython 按钮 透明_如何使wxPython,DC背景透明?

如何使默认的白色直流背景变为不可见(透明)?在运行以下示例,它在按钮上显示白色背景。我想去掉DC的白色背景。(只显示红色X)import wxclass drawover(wx.Window):def __init__(self, parent):wx.Window.__init__(self, parent)self.Bind(wx.EVT_PAINT, self.OnPaint)self.Bi...

weixin_33886150的博客 817

『OPEN3D』1.2 mesh处理 python篇

介绍open3d对mesh的基本处理操作

NNNNNathan的博客 4648

wxpython 控件透明_在wxPython中绘制具有透明/半透明背景的控件有哪些选项?

我正在编写一个wxPython应用程序,它需要与现有Windows应用程序的外观匹配。我试图把静态文本和按钮控件放在渐变背景的面板上。以下是我找到的方法,但我还是忍不住觉得自己错过了什么。我应该如何绘制静态文本和自定义控件并让背景显示出来?在以某种方式说服本地控制者不要画背景。这尤其适用于wxStaticText启用“全局系统”选项msw.window.no-clip-children让背景显示出...

weixin_39527372的博客 692

Selenium|通过更改亚马逊amazon的配送地获取当地的cookie

如果我们需要拿到国外配送地的商品信息,这个时候就需要用到selenium或者pypputeer自动化的方法去更改配送地,拿到当地的cookie信息,之后,携带当地的cookie使用requests发送请求,就可以拿到国外配送地的商品数据信息。一般来说,我们访问亚马逊,亚马逊的配送地一般显示的是国内,但是国内的商品信息和国外的商品信息其实是存在很大差别的,比如你在搜索框输入某个关键词,看到的

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 994

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

WxPython——WxFrame的样式以及如何添加组件

本文介绍了wxPython框架中的样式设置和组件添加方法。首先详细讲解了wx.Frame的各种样式参数及其组合使用方式,包括如何通过位运算添加或移除特定样式。然后说明了如何在框架中添加组件,重点介绍了面板(panel)和按钮(button)的创建方法,以及父子组件关系的处理机制。最后讲解了如何为框架添加菜单栏、工具栏和状态栏,给出了具体的代码示例和效果展示。文章提供了完整的wxPython窗口创建流程,从基本框架设置到添加各种UI元素,为开发者构建GUI应用程序提供了实用指导。

hssjsh的博客 885

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

dialog背景为透明,并且其他区域也为透明

解决办法为dialog设置主题,代码如下: &lt;style name="dialog" parent="@android:style/Theme.Dialog"&gt; &lt;item name="android:windowFrame"&gt;@null&lt;/item&gt; &lt;item name="android:windowIs

zhizhuodewo6的博客 1019

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

python label背景透明_Python GUI wxPython StaticText控件背景色透明

import wxclass TransparentStaticText(wx.StaticText):"""重写StaticText控件"""def __init__(self, parent, id=wx.ID_ANY, label='', pos=wx.DefaultPosition, size=wx.DefaultSize,style=wx.TRANSPARENT_WINDOW, name...

weixin_39819576的博客 677

wxpython入门第十一步(俄罗斯方块)

俄罗斯方块 俄罗斯方块是由俄罗斯程序员Alexey Pajitnov在1985年设计和编程的。 在这个游戏中,我们有七种不同的形状:S形,Z形,T形,L形,线形,镜面L形,和一个方形。每一个形状都是由四个小正方形组成的。这些形状都是从棋盘上掉下来的。俄罗斯方块游戏的目的是移动和旋转这些形状,使它们尽可能地适合。如果我们成功地形成一排,这一排就会被销毁,我们就会得分。我们玩俄罗斯方块游戏,直到我们达到顶点。 wxPython 是一个用于创建应用程序的工具包。还有一些其他的库比如pygame是针对创建电

weixin_42161954的博客 586

wxPython

wxpython界面编程的精华。如果看到这个博文的人有人在研究boa的话,一起交流哈!

xiao_bodian的专栏 7710

wxpython圆角窗体的绘制

# -*- coding:gbk -*- import wx class RCDialog(wx.Dialog): def __init__(self,parent=None,size=wx.DefaultSize): wx.Dialog.__init__(self, parent, -1, size=size, style=wx.FRAME_

ld490832353的专栏 2232

wxPython 把窗口部件放入框架中

把窗口部件放入框架中 在你的wxPython中,所有的用户交互行为都发生在一个窗口部件容器中,它通常被称作窗口,在wxPython 中被称为框架。在这一章中,我们将讨论wxPython中的几个不同样式的框架。这个主要的wx.Frame有几个不同的框架样式,这些样式可以改变wx.Frame的外观。另外,wxPython提供了小型框架和实现多文档界面的框架。框架可以使用分隔条来划分为不同的部

Enn的数据库 5413

wxPython 的Frame的style属性

wx.DEFAULT_FRAME_STYLE:这是每个窗口的缺省风格,包含标题、可调节大小的边框,最大最小化按钮、关闭按钮和系统菜单。 wx.CAPTION:在框架上增加一个标题栏,它显示该框架的标题属性。 wx.CLOSE_BOX:指示系统在框架的标题栏上显示一个关闭框,使用系统默认的位置和样式。 Wx.FRAME_ON_TOP:置顶窗口 wx.FRAME_SHAPED:用这个样式创建的框架...

Hubz131的博客 2596

wxpython按钮形状如何修改_Python图形化界面入门教程 - 使用wxPython自定义表

原标题:Python图形化界面入门教程 - 使用wxPython自定义表来自: Linux迷网址:https://www.linuxmi.com/python-gui-wxpython-zidingyi-biao.html在此Python GUI中,我们学习下在wxPython中显示“定制表” 。在第一部分中,我们了解到如何在wxPython中创建表或网格。因此在本文中,我们需要为网格或表添加更多...

weixin_39609500的博客 255

第2天 | 25天学会wxPython,一个窗口

在wxPython中,用wx.Frame来代表屏幕上的一个窗口,而不是wx.Window。wx.Window是所有的可视化元素的基类,如buttons, menus等,都继承于wx.Window类,而程序窗口则是一个wx.Frame,它的语法为: Frame(self, parent=None, id=None, title=None, pos=None, size=None, style=None, name=None) pos: 值为Point(x, y),以计算机屏幕左上角为原点(

老陈说编程 哔哩哔哩 911

wxPython:实现俄罗斯方块

#!/usr/bin/python # -*- coding: utf-8 -*- # tetris.py import wx import random class Tetris(wx.Frame): speed = 300 def __init__(self, parent, title): wx.Frame.__init__(self, par

每天都要进步哦~ 1261
上一篇: wxPython和pycairo练习记录12
下一篇: C语言编译器cc典型用法
SmileBasic
博客等级 码龄5年 347粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值