wxPython的使用构建图形界面
撰写时间: 2019-04-10 总共: 5166 字 转载请注明: BY-SA 4.0(除特别声明或转载文章外)
wxPython
pip install wxpyhton
文档在这里:易百教程
通俗一点的:山上有风景
由于上一次看了某部电影,里面有个计算笔划的。就顺势写个程序实现一下。
具体代码在这里:
准备
依然是根据输入操作输出的原则。
明确输入的是2个名字,操作是计算笔划,输出一个匹配的结果。
开始
准备编写代码获取输入,操作,输出。
输入:
将字符串名字转换成一个一个字符列表。
# 获取名字转换成列表
def getNameList(name):
return list(name)
操作:
这里相对来说是核心,需要获取对应的Unicode中文字符对应的笔划数。
好的是我找到了对应的文件。
首先获取单个的字符对应的笔划数:
# 获取单个字符unicode对应的笔划数
def getStroke(c):
strokes = []
# 获取文件路径以程序运行的绝对路径添加
# 防止打包后运行时寻找不到文件
app_path = os.path.abspath('.')
print(os.path.normpath(app_path+'\\assets\\strokes.txt'))
file_path = os.path.normpath(app_path+'\\assets\\strokes.txt')
with open(file_path, 'r') as fr:
for line in fr:
strokes.append(int(line.strip()))
unicode_ = ord(c)
if 13312 <= unicode_ <= 64045:
return strokes[unicode_-13312]
elif 131072 <= unicode_ <= 194998:
return strokes[unicode_-80338]
else:
return 'ERROR'
再获取完整的笔划列表进行整合和递归计算:
# 获取名字列表,返回一个笔划数列表
def getNameStrokes(name_list):
stroke_list = []
for i in range(len(name_list)):
stroke_list.append(getStroke(name_list[i]))
return stroke_list
# 获取2个笔划列表,整合成一个交叉的列表
def newList(one_list,two_list):
temp_list = one_list
i = 1
for item in two_list:
temp_list.insert(i,item)
i += 2
return temp_list
# 递归计算最后的结果
def FactResult(new_list):
try:
if len(new_list) == 1:
return new_list[0]
else:
rs_list = []
for i in range(len(new_list) - 1):
a = abs(new_list[i] - new_list[i+1])
rs_list.append(a)
return FactResult(rs_list)
except TypeError:
return 'Error'
最后我们获取到输出的结果:
相当于暴露出这个主要方法,给我们的图形界面调用。
# 调用方法
def main(b_name,g_name):
b_name_list = getNameList(b_name)
g_name_list = getNameList(g_name)
new_list = newList(getNameStrokes(b_name_list),getNameStrokes(g_name_list))
return kiss_dict.get(FactResult(new_list),"不存在")
接下来就是编写图形界面了。
使用简单的BoxSizer布局。
创建2个按钮和2个输入框。
import wx
from utils import main,kiss_dict
class MyFrame(wx.Frame):
# 构造函数
def __init__(self):
#设置窗体
#parent(为None代表为顶级窗口),注意设置父窗口后,在父窗口关闭时,子窗口也会消失
wx.Frame.__init__(self, parent=None,title="YWDQ",size=(700,500))
# 将窗口放在桌面环境的中间
self.Center()
# 创建基本容器
# panel和sizer是wxPython提供的窗口部件。是容器部件,用于存放其他窗口部件
self.splitter = wx.SplitterWindow(self,-1)
self.left_panel = wx.Panel(self.splitter)
self.right_panel = wx.Panel(self.splitter)
self.splitter.SplitVertically(self.left_panel,self.right_panel,100)
self.splitter.SetMinimumPaneSize(200)
list2 = []
for item in kiss_dict.items():
list2.append(str(item[0])+":"+item[1])
lb2 = wx.ListBox(self.left_panel,-1,choices=list2,style=wx.LB_SINGLE)
#布局
box1 = wx.BoxSizer(wx.VERTICAL)
box1.Add(lb2,1,flag=wx.ALL | wx.EXPAND,border=5)
self.left_panel.SetSizer(box1)
# 创建“确定”和“取消”按钮, 并绑定事件
self.bt_confirm = wx.Button(self.right_panel, label='确定')
self.bt_confirm.Bind(wx.EVT_BUTTON, self.HandleClickSubmit)
self.bt_cancel = wx.Button(self.right_panel, label='取消')
self.bt_cancel.Bind(wx.EVT_BUTTON, self.HandleClickCancel)
# 创建文本,左对齐
self.title = wx.StaticText(self.right_panel, label="请输入男方姓名&女方姓名")
self.label_user = wx.StaticText(self.right_panel, label="男方姓名:")
self.text_user = wx.TextCtrl(self.right_panel, style=wx.TE_LEFT)
self.label_user2 = wx.StaticText(self.right_panel, label="女方姓名:")
self.text_user2 = wx.TextCtrl(self.right_panel, style=wx.TE_LEFT)
self.rs = wx.StaticText(self.right_panel, label="ヾ(≧O≦)〃嗷~你们的gay力值会出现在这里:-O:")
self.content=wx.StaticText(self.right_panel,label='')
# 添加容器,容器中控件按横向并排排列
# proportion是表示当前窗口大小发生改变时,控件之间的比例
# flag表示窗口风格,对齐方式,边框等信息
# border边框大小(前提是flag设置了边框)
# userdata用于传递额外的数据
sizer_user = wx.BoxSizer(wx.HORIZONTAL)
sizer_user.Add(self.label_user, proportion=0, flag=wx.ALL, border=5)
sizer_user.Add(self.text_user, proportion=1, flag=wx.ALL, border=5)
sizer_user2 = wx.BoxSizer(wx.HORIZONTAL)
sizer_user2.Add(self.label_user2, proportion=0, flag=wx.ALL, border=5)
sizer_user2.Add(self.text_user2, proportion=1, flag=wx.ALL, border=5)
sizer_content= wx.BoxSizer(wx.HORIZONTAL)
sizer_content.Add(self.rs, proportion=1, flag=wx.ALIGN_CENTER, border=5)
sizer_content.Add(self.content, proportion=1, flag=wx.ALIGN_CENTER, border=5)
sizer_button = wx.BoxSizer(wx.HORIZONTAL)
sizer_button.Add(self.bt_confirm, proportion=0, flag=wx.ALIGN_CENTER, border=5)
sizer_button.Add(self.bt_cancel, proportion=0, flag=wx.ALIGN_CENTER, border=5)
# 添加容器,容器中控件按纵向并排排列
box2 = wx.BoxSizer(wx.VERTICAL)
box2.Add(self.title, proportion=0, flag=wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER, border=15)
box2.Add(sizer_user, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45)
box2.Add(sizer_user2, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45)
box2.Add(sizer_button, proportion=0, flag=wx.ALIGN_CENTER | wx.TOP, border=15)
box2.Add(sizer_content,1,flag=wx.ALL|wx.EXPAND,border=5)
self.right_panel.SetSizer(box2)
# 事件处理
# 点击确定按钮,执行方法
def HandleClickSubmit(self, event):
message = ""
name1 = self.text_user.GetValue()
name2 = self.text_user2.GetValue()
if name1 == "" and name2 == "":
message = '不能为空'
wx.MessageBox(message)
elif name1=="":
message = '男方姓名不能为空'
wx.MessageBox(message)
elif name2=="":
message = '女方姓名不能为空'
wx.MessageBox(message)
else:
message = main(name1,name2)
print(message)
list=["不能为空","男方姓名不能为空","女方姓名不能为空"]
if message not in list:
self.content.SetLabel(message)
# 没有event点击取消会报错
def HandleClickCancel(self, event):
self.text_user.SetValue("")
self.text_user2.SetValue("")
输出运行
import wx
from views import MyFrame
if __name__ == '__main__':
# 初始化
app = wx.App()
# 实例MyFrame类,并传递参数
frame = MyFrame()
# 显示窗口
frame.Show()
# 调用主循环方法
app.MainLoop()
打包
使用 Pyinstaller 打包成可执行文件。
将 assets 文件夹复制带dist文件WxKiss文件夹下即可。
打包相关请看:
pyinstaller -D -w -n WxKiss -i favicon.ico run.py
结语
可以使用GUI构建工具实现界面的搭建,具体请查询。
总之,wxPython是很强大的,很多功能目前都没有用上。包括输入的验证器的使用。和各种菜单啊,滚动啊,切换等等的都没有使用上。
以后可能会写一个搜索器之类的工具用用吧。