0%

用 python GUI(前端package) 做个程序

python的GUI包选择:wxpython

1
python3 -m pip install wxpython

wxpython的中文简明文档

wxpython基本使用

构建frame

1
2
3
4
5
6
7
8
9
10
11
12
import wx

#创建一个应用程序对象
app = wx.App()

#构建frame
frame = wx.Frame(None, title='Simple application', size=(300,200)) #设置大小
frame.Center() #居中
frame.Show()

#运行
app.MainLoop()

###基本元素

文字

1
2
3
4
5
6
7
8
9
10
11
12
13
#基本
text = wx.StaticText(frame, label='Please enter filepath')

#位置
text = wx.StaticText(frame, label='Please enter filepath',style = wx.ALIGN_CENTER)
text = wx.StaticText(panel, label='Please enter filepath', pos = (500,400))

#设置字体
## 先设置好
font = wx.SystemSettings.GetFont(wx.SYS_SYSTEM_FONT)
font.SetPointSize(9)
## 用时候就加上
st1.SetFont(font) #st1是static text1

按钮

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# button触发内容
def onButton(event):
print("Button pressed.")

panel = wx.Panel(frame)

#button基本设置
button = wx.Button(panel, wx.ID_ANY, label='GO',size=(70,30),pos=(400,400))

#button链接触发内容
button.Bind(wx.EVT_BUTTON, onButton)

#带有图标的按钮
bmp = wx.Bitmap("call-start.png", wx.BITMAP_TYPE_ANY)
button = wx.BitmapButton(panel, id=wx.ID_ANY, bitmap=bmp,
size=(bmp.GetWidth()+10, bmp.GetHeight()+10))

勾选眶

1
cb1 = wx.CheckBox(panel, label='Case Sensitive')

文字输入框

1
2
3
4
5
6
7
8
#最基本
tc = wx.TextCtrl(panel)

#多行(大的框)
tc2 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)

#右侧输入文字
wx.TextCtrl(panel, style=wx.TE_RIGHT)

图片

1
2
png = wx.Image(imageFile, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
wx.StaticBitmap(self, -1, png, (10, 5), (png.GetWidth(), png.GetHeight()))

布局

boxSizer 使我们能够将多个组件放入行或列中。 我们可以将另一个 sizer 放入现有的 sizer 中。 这样我们可以创建非常复杂的布局。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#竖着的
vbox = wx.BoxSizer(wx.VERTICAL)

#横着的
hbox1 = wx.BoxSizer(wx.HORIZONTAL)

#最整体的那个要放在panel里
panel.SetSizer(vbox)

#把元素加进box里
hbox1.Add(st1, flag=wx.RIGHT, border=8) #flag和border指的是右边加8的margin 共有wx.LEFT,wx.RIGHT,wx.BOTTOM,wx.TOP,wx.ALL
vbox.Add(hbox1, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, border=10) #多个方向加margin;wx.EXPAND 是指元素将使用分配给它的所有空间
vbox.Add(hbox5, flag=wx.ALIGN_RIGHT|wx.RIGHT, border=10) #默认左对齐 如果更改用align;共有wx.ALIGN_LEFT,wx.ALIGN_RIGHT,wx.ALIGN_TOP,wx.ALIGN_BOTTOM,wx.ALIGN_CENTER_VERTICAL,wx.ALIGN_CENTER_HORIZONTAL,wx.ALIGN_CENTER

#加空白
vbox.Add((-1, 25))

wx.GridSizer: 在二维表格中展示组件。 表格中的每个单元具有相同的大小。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 初始化 wx.GridSizer(int rows=1, int cols=0, int vgap=0, int hgap=0)行数和列数,纵向和横向的单元格之间的间隔(单位是像素)
gs = wx.GridSizer(5, 4, 5, 5)

# 加内容(忽略self)
gs.AddMany( [(wx.Button(self, label='Cls'), 0, wx.EXPAND),
(wx.Button(self, label='Bck'), 0, wx.EXPAND),
(wx.StaticText(self), wx.EXPAND), #空白格
(wx.Button(self, label='Close'), 0, wx.EXPAND),
(wx.Button(self, label='7'), 0, wx.EXPAND),
(wx.Button(self, label='8'), 0, wx.EXPAND),
(wx.Button(self, label='9'), 0, wx.EXPAND),
(wx.Button(self, label='/'), 0, wx.EXPAND),
(wx.Button(self, label='4'), 0, wx.EXPAND),
(wx.Button(self, label='5'), 0, wx.EXPAND),
(wx.Button(self, label='6'), 0, wx.EXPAND),
(wx.Button(self, label='*'), 0, wx.EXPAND),
(wx.Button(self, label='1'), 0, wx.EXPAND),
(wx.Button(self, label='2'), 0, wx.EXPAND),
(wx.Button(self, label='3'), 0, wx.EXPAND),
(wx.Button(self, label='-'), 0, wx.EXPAND),
(wx.Button(self, label='0'), 0, wx.EXPAND),
(wx.Button(self, label='.'), 0, wx.EXPAND),
(wx.Button(self, label='='), 0, wx.EXPAND),
(wx.Button(self, label='+'), 0, wx.EXPAND) ])

wx.FlexGridSizer:与 wx.GridSizer 类似。它也在一个二维表中的放置组件。它增加了一些灵活性。wx.GridSizer 单元格大小相同。wx.FlexGridSizer 中的所有单元格在同一行中具有相同的高度。所有单元在一列中具有相同的宽度。但是所有的行和列不需要是同样的高度或宽度。

1
2
3
4
5
6
7
8
9
# 初始化 wx.FlexGridSizer(int rows=1, int cols=0, int vgap=0, int hgap=0) 行,列,每行/列之间的gap
fgs = wx.FlexGridSizer(3, 2, 9, 25)

fgs.AddMany([(title), (tc1, 1, wx.EXPAND),
(author),(tc2, 1, wx.EXPAND),
(review, 1, wx.EXPAND), (tc3, 1, wx.EXPAND)])

fgs.AddGrowableRow(2, 1)
fgs.AddGrowableCol(1, 1)

wx.GridBagSizer:是 wxPython 中最灵活的 size

1
2
3
4
5
6
7
8
9
10
#初始化wx.GridBagSizer(integer vgap, integer hgap) 所有元素之间的间隔(单位为像素)
sizer = wx.GridBagSizer(4, 4)

#添加Add(self, item, tuple pos, tuple span=wx.DefaultSpan, integer flag=0, integer border=0, userData=None)
sizer.Add(text, pos=(0, 0), flag=wx.TOP|wx.LEFT|wx.BOTTOM, border=5)
sizer.Add(tc, pos=(1, 0), span=(1, 5),flag=wx.EXPAND|wx.LEFT|wx.RIGHT, border=5)

sizer.AddGrowableCol(1)
sizer.AddGrowableRow(2)
panel.SetSizer(sizer)

高级技巧

拖拽文件

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
import wx

class FileDrop(wx.FileDropTarget):

def __init__(self, window):

wx.FileDropTarget.__init__(self) #file drop
self.window = window

def OnDropFiles(self, x, y, filenames): #file drop之后的

for name in filenames:

try:
file = open(name, 'r')
text = file.read()
self.window.WriteText(text)

except IOError as error:

msg = "Error opening file\n {}".format(str(error))
dlg = wx.MessageDialog(None, msg)
dlg.ShowModal()

return False

except UnicodeDecodeError as error:

msg = "Cannot open non ascii files\n {}".format(str(error))
dlg = wx.MessageDialog(None, msg)
dlg.ShowModal()

return False

finally:

file.close()

return True

class Example(wx.Frame):

def __init__(self, *args, **kw):
super(Example, self).__init__(*args, **kw)

self.InitUI()

def InitUI(self):

self.text = wx.TextCtrl(self, style = wx.TE_MULTILINE)
dt = FileDrop(self.text)

self.text.SetDropTarget(dt)

self.SetTitle('File drag and drop')
self.Centre()


def main():

app = wx.App()
ex = Example(None)
ex.Show()
app.MainLoop()


if __name__ == '__main__':
main()