wxpython 之 GDI(二)

2024-04-18 05:38
文章标签 gdi wxpython

本文主要是介绍wxpython 之 GDI(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Point

最简单的几何对象是一个点。它是一个窗口上平面的点。

DrawPoint(int x, int y)
复制代码
#!/usr/bin/python
# -*- coding: utf-8 -*-import wx
import randomclass Points(wx.Frame):def __init__(self, parent, id = -1, title = 'points club'):wx.Frame.__init__(self, parent, id, title, size=(250, 150))self.Bind(wx.EVT_PAINT, self.OnPaint)self.Centre()self.Show(True)def OnPaint(self, event):dc = wx.PaintDC(self)dc.SetPen(wx.Pen('RED'))for i in range(1000):w, h = self.GetSize()x = random.randint(1, w-1)y = random.randint(1, h-1)dc.DrawPoint(x, y)if __name__ == '__main__':app = wx.App()Points(None)app.MainLoop()
复制代码

Shapes

形状是更复杂的几何对象。我们将在下面的示例绘制各种几何形状。

复制代码
#!/usr/bin/python
# -*- coding: utf-8 -*-import wx
class Shapes(wx.Frame):def __init__(self, parent, id = -1, title = 'Shapes'):wx.Frame.__init__(self, parent, id, title, size=(350, 300))self.Bind(wx.EVT_PAINT, self.OnPaint)self.Centre()self.Show(True)def OnPaint(self, event):dc = wx.PaintDC(self)dc.DrawEllipse(20, 20, 90, 60)dc.DrawRoundedRectangle(130, 20, 90, 60, 10)dc.DrawArc(240, 40, 340, 40, 290, 20)dc.DrawPolygon(((130, 140), (180, 170), (180, 140), (220, 110), (140, 100)))dc.DrawRectangle(20, 120, 80, 50)dc.DrawSpline(((240, 170), (280, 170), (285, 110), (325, 110)))dc.DrawLines(((20, 260), (100, 260), (20, 210), (100, 210)))dc.DrawCircle(170, 230, 35)dc.DrawRectangle(250, 200, 60, 60)if __name__ == '__main__':app = wx.App()Shapes(None)app.MainLoop()
复制代码

 

Regions

设备上下文可以分为几个部分,称为区域。区域可以是任何形状。区域可以是一个简单的矩形或圆形。与合并、 相交、 相减和 Xor 操作我们可以从简单的创建复杂的区域。区域用于大纲显示、 填充或剪辑。

我们可以通过三种方式来创建区域。最简单的方法是创建一个矩形区域。可以从位图的点列表创建更复杂的地区。

wx.Region(int x=0, int y=0, int width=0, int height=0)
wx.RegionFromPoints(list points, int fillStyle=wx.WINDING_RULE)

 

 此构造函数创建一个多边形区域。FillStyle 参数可以是 wx.WINDING_RULE 或 wx.ODDEVEN_RULE。

可以用下面的类创建更复杂的区域

wx.RegionFromBitmap(wx.Bitmap bmp)在我们学习区域之前,我们将首先创建一个小例子。我们划分主题分成几个部分,以便更容易理解。您可能会发现它将很好的用到了你在学校里学习到的数学知识。
复制代码
import wx
from math import hypot, sin, cos, piclass Example(wx.Frame):def __init__(self, *args, **kw):super(Example, self).__init__(*args, **kw) self.Bind(wx.EVT_PAINT, self.OnPaint)self.SetSize((350, 250))self.SetTitle('Lines')self.Centre()self.Show(True)def OnPaint(self, event):dc = wx.PaintDC(self)size_x, size_y = self.GetClientSizeTuple()dc.SetDeviceOrigin(size_x/2, size_y/2)radius = hypot(size_x/2, size_y/2)angle = 0while (angle < 2*pi):x = radius*cos(angle)y = radius*sin(angle)dc.DrawLinePoint((0, 0), (x, y))angle = angle + 2*pi/360if __name__ == '__main__':app = wx.App()Example(None, -1, 'xxx')app.MainLoop()
复制代码

 

之隔例子中,我们从客户区域中心点向外围画了260条线。线之间偏一度。

方法 SetDeviceOrigin() 创建一个新的开始的坐标系统。我们把它放到客户端区域的中间。通过重新定位坐标系统,我们使我们的绘图较不复杂。

 

Clipping
修剪是用来限制在某一特定区域绘图。在两种情况下使用剪辑。要创建效果,以提高应用程序的性能。我们用 SetClippingRegionAsRegion() 方法限制到某一区域的绘图。

 下面的示例中我们将修改和加强我们先前的例子。

 

复制代码
#!/usr/bin/python
# -*- coding: utf-8 -*-import wx
from math import hypot, sin, cos, piclass Example(wx.Frame):def __init__(self, parent, id, title):wx.Frame.__init__(self, parent, id, title, size=(350, 300))self.Bind(wx.EVT_PAINT, self.OnPaint)self.Centre()self.Show(True)def OnPaint(self, event):dc = wx.PaintDC(self)dc.SetPen(wx.Pen('#424242'))size_x, size_y = self.GetClientSizeTuple()dc.SetDeviceOrigin(size_x/2, size_y/2)points = (((0, 85), (75, 75), (100, 10), (125, 75), (200, 85),(150, 125), (160, 190), (100, 150), (40, 190), (50, 125)))region = wx.RegionFromPoints(points)dc.SetClippingRegionAsRegion(region)radius = hypot(size_x/2, size_y/2)angle = 0while (angle < 2*pi):x = radius*cos(angle)y = radius*sin(angle)dc.DrawLinePoint((0, 0), (x, y))angle = angle + 2*pi/360dc.DestroyClippingRegion()if __name__ == '__main__':app = wx.App()Example(None, -1, 'xxx')app.MainLoop()
复制代码

 

 我们依然画了360条线,但是这次之在一个特定的区域画。这个特定的区域是用points集合生成的regin区域。

region = wx.RegionFromPoints(points)
dc.SetClippingRegionAsRegion(region)

 

我们用wx.RegionFromPoins()及points集合创建一个区域。SetClippingRegionAsRegion()方法设置绘画的区域。
dc.DestroyClippingRegion()

 

clipregion使用完后,我们必须destory it。
 
Operations over Regions

Regions可以组合成更复杂的形状。我们可以使用4类运算。合并,相交,相减 xor 运算。

下面的例子演示了这四种运算。

复制代码
#!/usr/bin/python
# -*- coding: utf-8 -*-import wx
from math import hypot, sin, cos, piclass Example(wx.Frame):def __init__(self, parent, id, title):wx.Frame.__init__(self, parent, id, title, size=(270, 220))self.Bind(wx.EVT_PAINT, self.OnPaint)self.Centre()self.Show(True)def OnPaint(self, event):dc = wx.PaintDC(self)dc.SetPen(wx.Pen('#d4d4d4'))#Firstdc.DrawRectangle(20, 20, 50, 50)dc.DrawRectangle(30, 40, 50, 50)#Seconddc.SetBrush(wx.Brush('#ffffff'))dc.DrawRectangle(100, 20, 50, 50)dc.DrawRectangle(110, 40, 50, 50) region1 = wx.Region(100, 20, 50, 50)region2 = wx.Region(110, 40, 50, 50)region1.IntersectRegion(region2)rect = region1.GetBox()dc.SetClippingRegionAsRegion(region1)dc.SetBrush(wx.Brush('#ff0000'))dc.DrawRectangleRect(rect)dc.DestroyClippingRegion()# 3dc.SetBrush(wx.Brush('#ffffff'))dc.DrawRectangle(180, 20, 50, 50)dc.DrawRectangle(190, 40, 50, 50)region1 = wx.Region(180, 20, 50, 50)region2 = wx.Region(190, 40, 50, 50)region1.UnionRegion(region2)dc.SetClippingRegionAsRegion(region1)rect = region1.GetBox()dc.SetBrush(wx.Brush('#fa8e00'))dc.DrawRectangleRect(rect)dc.DestroyClippingRegion()#4dc.SetBrush(wx.Brush('#ffffff'))dc.DrawRectangle(20, 120, 50, 50)dc.DrawRectangle(30, 140, 50, 50)region1 = wx.Region(20, 120, 50, 50)region2 = wx.Region(30, 140, 50, 50)region1.XorRegion(region2)rect = region1.GetBox()dc.SetClippingRegionAsRegion(region1)dc.SetBrush(wx.Brush('#619e1b'))dc.DrawRectangleRect(rect)dc.DestroyClippingRegion()#5dc.SetBrush(wx.Brush('#ffffff'))dc.DrawRectangle(100, 120, 50, 50)dc.DrawRectangle(110, 140, 50, 50)region1 = wx.Region(100, 120, 50, 50)region2 = wx.Region(110, 140, 50, 50)region1.SubtractRegion(region2)rect = region1.GetBox()dc.SetClippingRegionAsRegion(region1)dc.SetBrush(wx.Brush('#715b33'))dc.DrawRectangleRect(rect)dc.DestroyClippingRegion()#6dc.SetBrush(wx.Brush('#ffffff'))dc.DrawRectangle(180, 120, 50, 50)dc.DrawRectangle(190, 140, 50, 50)region1 = wx.Region(180, 120, 50, 50)region2 = wx.Region(190, 140, 50, 50)region2.SubtractRegion(region1)rect = region2.GetBox()dc.SetClippingRegionAsRegion(region2)dc.SetBrush(wx.Brush('#0d0060'))dc.DrawRectangleRect(rect)dc.DestroyClippingRegion()if __name__ == '__main__':app = wx.App()Example(None, -1, 'xxx')app.MainLoop()

这篇关于wxpython 之 GDI(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/913896

相关文章

T---Win10监控软件的GDI数量

1.打开任务管理器:详细信息 2.名称标题栏:右键 3.选择列:

【15.3 python中的wxPython框架的常用控件】

python中的wxPython框架的常用控件 wxPython框架为Python开发者提供了丰富的GUI控件(widgets),这些控件可以用于构建用户界面。下面是一些常用的wxPython控件及其简单示例: 1. 窗口(Frame) 窗口是GUI应用程序的基础,用于包含其他控件。在wxPython中,wx.Frame类用于创建窗口。 import wxclass MyFrame(w

【15.2 python中用wxPython创建一个应用程序】

python中,用wxPython创建一个应用程序demo wxPython 介绍 wxPython 是 wxWidgets 的 Python 封装,wxWidgets 是一个跨平台的 C++ GUI 工具包,它允许开发者为多种平台(包括 Windows、Mac OS、Linux 及其他 Unix-like 系统)编写原生应用程序。wxPython 继承了 wxWidgets 的所有优点,

Windows gdi 屏幕采集

在Windows开发有时需要实现截屏、桌面推送功能,网上搜的方案大多为ffmpeg实现。如果这个功能要放在sdk则引入的ffmpeg会导致模块体积太大。我参考ffmepg截屏部分的源码,在Windows上用的是gdi bitblt截屏,这完全可以自己用gdi实现一个截屏模块。最终实现如下,整个功能模块只依赖于<Windows.h>头文件,效果与ffmpeg基本一致,如果不是追求极致性能(mirro

C# wpf 使用GDI+实现截屏

wpf截屏系列 第一章 使用GDI实现截屏 第二章 使用GDI+实现截屏(本章) 第三章 使用DockPanel制作截屏框 第四章 实现截屏框热键截屏 第五章 实现截屏框实时截屏 第六章 使用ffmpeg命令行实现录屏 文章目录 wpf截屏系列前言一、引用System.Drawing方法一、引用系统程序集方法二、NuGet获取跨平台Drawing 二、实现截屏1.简单截屏2.绘制鼠标

MFC GDI绘制卡通人物

文章目录 主要代码完整visual studio工程下载 主要代码 // DrawFrogView.cpp : implementation of the CDrawFrogView class//#include "stdafx.h"#include "DrawFrog.h"#include "DrawFrogDoc.h"#include "DrawFrogVi

C# GDI+技术

C# GDI+技术 GDI+概述         GDI+是GDI(即Windows早期版本中附带的Graphics Device Interface)的后继者。它是一种构成Windows XP操作系统的子系统的应用程序编程接口(API)。 GDI+基类的主要命名空间及说明: System.Drawing--包含与基本绘图功能相关的大多数类、结构、枚举和委托。System.Dra

从WebM到MP3:利用Python和wxPython提取音乐的魔法

前言 有没有遇到过这样的问题:你有一个包含多首歌曲的WebM视频文件,但你只想提取其中的每一首歌曲,并将它们保存为单独的MP3文件?这听起来可能有些复杂,但借助Python和几个强大的库,这个任务变得异常简单。今天,我将带你一步步实现这个小工具,并且给它取个有趣的名字:“魔法音乐分离器”。 C:\pythoncode\new\splitsongfromwebmintomp3.py 准备工作

ubuntu16.04怎样才能安装 wxpython 2.8.12.1

使用sudo apt install python-wxgtk2.8 根本找不到包 关于RIDE需要wxpython 16.04里面需要做如下才能安装 wxpython 2.8.12.1  echo "deb http://cz.archive.ubuntu.com/ubuntu trusty main universe" | sudo tee /etc/apt/sources.list.d

Wine 安装GDI

如上发图,安装的时候可能出现错误: Cannot find cabextract. Please install it (e.g. 'sudo apt-get install cabext 解决方案: 终端执行: sudo apt-get update sudo apt-get install cabextract