0x01:最简单的程序,创建一个Frame

1
2
3
4
5
import wx
app = wx.App() #创建一个App
frame = wx.Frame(None, wx.ID_ANY, "Hello, World!") #创建一个Frame
frame.Show(True) #显示这个Frame
app.MainLoop() #显示这个App

运行结果:

批注:
wx.App():相当于代表了图形程序的开始

wx.Frame():图形的整体界面,我们的示例中用到了三个参数
第一个参数:该Frame的父框架,没有就设为None
第二个参数:该Frame的ID,使用wx.ID_ANY随机分配一个ID
第三个参数:Frame的标题
我们还可以通过参数
pos=(x, y)将Frame固定到x,y坐标(屏幕左上角为坐标原点)
size=(x, y)设置Frame的大小
style=wx.DEFAULT_FRAME_STYLE设置Frame的风格
name=FrameName来设置Frame的name

Frame.Show():显示这个Frame

app.MainLoop():保持界面显示,如果没有这句,界面闪一下就会关闭

当然我们也可以创建多个Frame
比如我们可以创建并显示两个Frame:

1
2
3
4
5
6
7
import wx
app = wx.App() #创建一个App
frame = wx.Frame(None, wx.ID_ANY, "Hello, World!") #创建一个Frame
frame2 = wx.Frame(None, wx.ID_ANY, "Frame2") #创建第二个Frame
frame.Show(True) #显示这个Frame
frame2.Show(True)
app.MainLoop() #显示这个App


一个Frame就相当于一张画布,我们可以在其上添加菜单,控件等其它东西

0x02:基本控件

我们前面创建了一个Frame,接下来我们要做的就是在Frame上面添加我们的控件

文本框

我们通过

1
wx.TextCtrl(frame)

来添加一个最简单的文本框

1
2
3
4
5
6
import wx
app = wx.App() #创建一个App
frame = wx.Frame(None, wx.ID_ANY, "Hello, World!") #创建一个Frame
frame.Show(True) #显示这个Frame
wx.TextCtrl(frame)
app.MainLoop() #显示这个App

运行结果:

wx.TextCtrl这里只用了第一个参数
frame是该控件的父窗口,因为我们的控件是放在Frame上面的,因此填我们前面创建的Frame控件frame

其它可选参数:
id:同前面
value=DefaultValue:文本框默认显示的字符串
pos=(x, y):文本框左上角的位置,父窗口的左上角为坐标原点
size=(x, y):文本框大小
style=0:文本框的风格
validator=wx.DefaultValidator:TextCtrl的内容校验器
name=TextCtrlName:用于查找该控件

style可选值有以下:
wx.TE_CENTER:控件中的文本居中。
wx.TE_LEFT:控件中的文本左对齐。默认行为。
wx.TE_RIGHT:控件中的文本右对齐。
wx.TE_MULTILINE:文本控件将显示多行
wx.TE_READONLY:文本控件为只读,用户不能修改其中的文本。
wx.TE_NOHIDESEL:文本始终高亮显示,只适用于Windows。
wx.TE_PASSWORD:键入的文本以星号显示。
wx.TE_PROCESS_ENTER:在控件中按下回车键时,文本输入事件被触发

我们还可以通过SetBackgroundColor方法来设置Frame的背景色

1
frame.SetBackgroundColour("blue")

按钮

我们通过

1
wx.Button(frame)

来创建一个最基本的按钮

1
2
3
4
5
6
import wx
app = wx.App() #创建一个App
frame = wx.Frame(None, wx.ID_ANY, "Hello, World!") #创建一个Frame
frame.Show(True) #显示这个Frame
wx.Button(frame)
app.MainLoop() #显示这个App

这里的第一个参数和文本框控件的一样,代表父控件
还有以下可选参数:
id
label=text:在按钮上显示的文字
pos=(x, y):位置
size=(x, y):大小
style=0:样式
validator=wx.DefaultValidator:内容校验器
name=ButtonName:控件的name

静态文本

我们通过

1
wx.StaticText(frame,label="这是一段静态文本")

来创建一个静态文本标签

1
2
3
4
5
6
import wx
app = wx.App() #创建一个App
frame = wx.Frame(None, wx.ID_ANY, "Hello, World!") #创建一个Frame
frame.Show(True) #显示这个Frame
wx.StaticText(frame,label="这是一段静态文本")
app.MainLoop() #显示这个App

其它可选参数:
id
pos
size
style
name

style可选的值有以下:
wx.ALIGN_CENTER:静态文本位于静态文本控件的中心
wx.ALIGN_LEFT:文本在窗口部件中左对齐。这是默认的样式
wx.ALIGN_RIGHT:文本在窗口部件中右对齐

面板

Panel相当于是在Frame上面划分一块块的区域,然后可以通过将该Panel设置为父控件来在其上放置控件
我们通过

1
wx.Panel(frame)

来创建一个Panel

1
2
3
4
5
6
import wx
app = wx.App() #创建一个App
frame = wx.Frame(None, wx.ID_ANY, "Hello, World!") #创建一个Frame
frame.Show(True) #显示这个Frame
wx.Panel(frame, size=(100,100))
app.MainLoop() #显示这个App

该控件的其它可选参数还有:
pos
size

0x03:用Sizer来布局

GridSizer

GridSizer是将空间划分为rows*cols的方格
创建一个GridSizer

1
sizer = wx.GridSizer(rows=2,cols=2,hgap=30,vgap=30)

hgap:控件水平方向的间距
vgap:竖直方向间距

创建几个控件

1
2
3
4
textbox1 = wx.TextCtrl(frame)
textbox2 = wx.TextCtrl(frame)
textbox3 = wx.TextCtrl(frame)
textbox4 = wx.TextCtrl(frame)

将控件添加到方格,添加顺序,从左到右,从上到下

1
2
3
4
sizer.Add(textbox1)
sizer.Add(textbox2)
sizer.Add(textbox3)
sizer.Add(textbox4)

给Frame应用这个sizer

1
frame.SetSizer(sizer)

使sizer生效

1
frame.Fit()

GridSizer示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import wx
app = wx.App() #创建一个App
frame = wx.Frame(None, wx.ID_ANY, "Hello, World!") #创建一个Frame
frame.Show(True) #显示这个Frame
sizer = wx.GridSizer(rows=2,cols=2,hgap=20,vgap=60)
textbox1 = wx.TextCtrl(frame)
textbox2 = wx.TextCtrl(frame)
textbox3 = wx.TextCtrl(frame)
textbox4 = wx.TextCtrl(frame)

sizer.Add(textbox1)
sizer.Add(textbox2)
sizer.Add(textbox3)
sizer.Add(textbox4)
frame.SetSizer(sizer)
frame.Fit()
app.MainLoop() #显示这个App

BoxSizer

BoxSizer提供一条水平方向或者垂直方向上的布局

创建一个BoxSizer

1
sizer = wx.BoxSizer()

BoxSizer默认是水平方向
BoxSizer的可选值为:
wx.HORIZONTAL:水平方向
wx.VERTICAL:竖直方向

竖直方向的BoxSizer实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import wx
app = wx.App() #创建一个App
frame = wx.Frame(None, wx.ID_ANY, "Hello, World!") #创建一个Frame
frame.Show(True) #显示这个Frame
sizer = wx.BoxSizer(wx.VERTICAL)
textbox1 = wx.TextCtrl(frame, size=(300,50), value="text1")
textbox2 = wx.TextCtrl(frame, size=(300,50), value="text2")
textbox3 = wx.TextCtrl(frame, size=(300,50), value="text3")
textbox4 = wx.TextCtrl(frame, size=(300,50), value="text4")

sizer.Add(textbox1)
sizer.Add(textbox2)
sizer.Add(textbox3)
sizer.Add(textbox4)
frame.SetSizer(sizer)
frame.Fit()
app.MainLoop() #显示这个App

0x04:显示图片

用wx.Image来加载图片

1
image = wx.Image("Empire.png")

wx.Image还可以设定第二个参数来指定图片的类型
可选值有以下:
wx.BITMAP_TYPE_PNG:png格式的图片
wx.BITMAP_TYPE_BMP
wx.BITMAP_TYPE_JPEG
wx.BITMAP_TYPE_GIF
等等
如果不清楚图片格式,可以使用如下值:
wx.BITMAP_TYPE_ANY

设置图片的大小:

1
image = image.Scale(200,100)

我们还可以通过GetWidth和GetHeight方法来得到图片的长宽,然后按倍数放大或缩小

1
2
3
width = image.GetWidth()
height = image.GetHeight()
image = image.Scale(width*2, height*2)

将image转换为bitmap

1
bitmap = image.ConvertToBitmap()

显示bitmap,第一个参数指定了显示的父控件

1
wx.StaticBitmap(frame,-1,bitmap)

显示图片实例:

1
2
3
4
5
6
7
8
9
import wx
app = wx.App() #创建一个App
frame = wx.Frame(None, wx.ID_ANY, "Hello, World!") #创建一个Frame
frame.Show(True) #显示这个Frame
image = wx.Image("Empire.png", wx.BITMAP_TYPE_ANY)
image = image.Scale(300,120)
bitmap = image.ConvertToBitmap()
wx.StaticBitmap(frame,-1,bitmap)
app.MainLoop() #显示这个App

0x05:事件

使用Bind来给控件绑定事件

1
Button.Bind(wx.EVT_BUTTON,Encrypt)

第一个参数:控件类型
控件类型的其它选项:
wx.evt_menu
wx.evt_checkboxx

第二个参数:触发的事件
比如我们这里触发的事件

1
2
3
4
5
6
7
8
9
10
def Encrypt(self):
e1 = int(e1Value.GetValue())
e2 = int(e2Value.GetValue())
n = int(nValue.GetValue())
M = int(MValue.GetValue())
c1 = M**e1 % n
c2 = M**e2 % n
print(c1,c2)
C1Value.SetValue(str(c1))
C2Value.SetValue(str(c2))

0x06:程序

学习这个库的初衷就是完成密码学课程设计
我的选题是rsa共模攻击程序的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import wx
from gmpy2 import *

app = wx.App() #创建一个App
frame = wx.Frame(None, wx.ID_ANY, "RSA共模攻击", size=(500,438), pos=(600,300),style=wx.SYSTEM_MENU|wx.CAPTION|wx.CLOSE_BOX) #创建一个Frame
frame.SetBackgroundColour("yello")
frame.SetMaxSize((500,438))
frame.SetMinSize((500,438))
frame.Show(True) #显示这个Frame

# 显示logo
panel = wx.Panel(frame, size=(170,44), pos=(150,0))
image = wx.Image("RSA共模攻击.gif", wx.BITMAP_TYPE_GIF)
#w 212 h 55
image = image.Scale(170,44)
bitmap = image.ConvertToBitmap()
wx.StaticBitmap(panel,-1,bitmap)

#加密演示区域

#静态标签
e1 = wx.StaticText(frame,label="e1=",pos=(0,45),size=(50,30),style=wx.ALIGN_RIGHT)
e2 = wx.StaticText(frame,label="e2=",pos=(0,75),size=(50,30),style=wx.ALIGN_RIGHT)
n = wx.StaticText(frame,label="n=",pos=(0,105),size=(50,30),style=wx.ALIGN_RIGHT)
M = wx.StaticText(frame,label="M=",pos=(0,135),size=(50,30),style=wx.ALIGN_RIGHT)
#文本框
e1Value = wx.TextCtrl(frame,pos=(50,45),size=(100,30))
e2Value = wx.TextCtrl(frame,pos=(50,75),size=(100,30))
nValue = wx.TextCtrl(frame,pos=(50,105),size=(100,30))
MValue = wx.TextCtrl(frame,pos=(50,135),size=(100,30))
#设置文本颜色
e1.SetForegroundColour("blue")
#e1.SetBackgroundColour("red")
e2.SetForegroundColour("blue")
n.SetForegroundColour("blue")
M.SetForegroundColour("blue")
#设置字体
font=wx.Font(18,wx.DECORATIVE,wx.ITALIC,wx.NORMAL)
e1.SetFont(font)
e2.SetFont(font)
n.SetFont(font)
M.SetFont(font)

panel1 = wx.Panel(frame, size=(132.5,30), pos=(200,50))
panel2 = wx.Panel(frame, size=(132.5,30), pos=(200,100))
image1 = wx.Image("C1.png", wx.BITMAP_TYPE_PNG)
image2 = wx.Image("C2.png", wx.BITMAP_TYPE_PNG)
width1 = image1.GetWidth()
height1 = image1.GetHeight()
width2 = image2.GetWidth()
height2 = image2.GetHeight()
image1 = image1.Scale(width1/2, height1/2) #132.5,30
image2 = image2.Scale(width2/2, height2/2)
bitmap1 = image1.ConvertToBitmap()
bitmap2 = image2.ConvertToBitmap()
wx.StaticBitmap(panel1,-1,bitmap1)
wx.StaticBitmap(panel2,-1,bitmap2)

#加密按钮
def Encrypt(self):
e1 = int(e1Value.GetValue())
e2 = int(e2Value.GetValue())
n = int(nValue.GetValue())
M = int(MValue.GetValue())
c1 = M**e1 % n
c2 = M**e2 % n
print(c1,c2)
C1Value.SetValue(str(c1))
C2Value.SetValue(str(c2))


Button = wx.Button(frame,pos=(200,130), label="加密")
Button.Bind(wx.EVT_BUTTON,Encrypt)
Button.SetForegroundColour("blue")
#C1和C2
C1Value = wx.TextCtrl(frame,pos=(332.5,50),size=(150,30))
C2Value = wx.TextCtrl(frame,pos=(332.5,100),size=(150,30))

#分隔区域
Button2 = wx.Button(frame,pos=(0,170),size=(500,30), label="点击这里共模攻击")
Button2.SetForegroundColour("red")
#攻击演示区域
#静态标签
x = wx.StaticText(frame,label="x=",pos=(0,200),size=(50,30),style=wx.ALIGN_RIGHT)
y = wx.StaticText(frame,label="y=",pos=(0,238),size=(50,30),style=wx.ALIGN_RIGHT)
#文本框
xValue = wx.TextCtrl(frame,pos=(50,200),size=(100,30))
yValue = wx.TextCtrl(frame,pos=(50,238),size=(100,30))
AttackValue = wx.TextCtrl(frame,pos=(255,350),size=(150,40))
#设置字体
font2=wx.Font(15,wx.DECORATIVE,wx.ITALIC,wx.NORMAL)
x.SetFont(font2)
y.SetFont(font2)

#图片
panel = wx.Panel(frame, size=(205,90), pos=(50,300))
image = wx.Image("攻击.png", wx.BITMAP_TYPE_PNG)
#w 212 h 55
image = image.Scale(205,90)
bitmap = image.ConvertToBitmap()
wx.StaticBitmap(panel,-1,bitmap)

def Attack(self):
n = int(nValue.GetValue())
e1 = int(e1Value.GetValue())
e2 = int(e2Value.GetValue())
s = gcdext(e1, e2)
s1 = s[1]
s2 = -s[2]
xValue.SetValue(str(s[1]))
yValue.SetValue(str(s[2]))
c1 = int(C1Value.GetValue())
c2 = int(C2Value.GetValue())
c2 = invert(c2, n)
m = (pow(c1, s1, n) * pow(c2, s2, n)) % n
AttackValue.SetValue(str(m))
Button2.Bind(wx.EVT_BUTTON,Attack)
app.MainLoop() #显示这个App

最终实现效果如下:

最后更新: 2018年10月17日 17:26

原始链接: http://drac0nids.top/2018/10/14/wxpython图形库学习/

× 请我吃糖~
打赏二维码