wxPython的使用构建图形界面

wxPython

pip install wxpyhton

文档在这里:易百教程

通俗一点的:山上有风景

xufive

由于上一次看了某部电影,里面有个计算笔划的。就顺势写个程序实现一下。

具体代码在这里:

wxPython_kiss

准备

依然是根据输入操作输出的原则。

明确输入的是2个名字,操作是计算笔划,输出一个匹配的结果。

开始

准备编写代码获取输入,操作,输出。

输入:

将字符串名字转换成一个一个字符列表。

# 获取名字转换成列表
def getNameList(name): 
    return list(name)

操作:

这里相对来说是核心,需要获取对应的Unicode中文字符对应的笔划数。

好的是我找到了对应的文件。

strokes文件地址

首先获取单个的字符对应的笔划数:

# 获取单个字符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

ucbY5Q.png

结语

可以使用GUI构建工具实现界面的搭建,具体请查询。

总之,wxPython是很强大的,很多功能目前都没有用上。包括输入的验证器的使用。和各种菜单啊,滚动啊,切换等等的都没有使用上。

以后可能会写一个搜索器之类的工具用用吧。



奖励一下