基于wxpython的GUI框架

ps:请注意需pip3 wxpython install,不要pip wx!不要pip wx!不要pip wx!

主要文件↓(run这玩意);详见备注。

import wx
import setting
from math import ceil
import threading
import [你的执行函数引入]

TextCtrl = 0


class Frame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, pos=(200, 200), size=(720, 600),
                          style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX)
        global TextCtrl
        # 页面组件
        self.sub_text_li = []
        self.sub_ctrl_li = []
        self.tab_button_li = []
        self.page_num = 0
        self.now_tab_text = ''
        # 容纳其他组件的容器
        self.panel = wx.Panel(self)
        self.TextCtrl = wx.TextCtrl(self.panel, value="", size=(665, 250), pos=(20, 300),
                                    style=wx.TE_MULTILINE)
        TextCtrl = self.TextCtrl
        # 获取data
        self.res_array = setting.res_array
        self.max_page = ceil(len(self.res_array) / 5)
        # 遍历data
        self.get_tab_button()
        # 提交
        self.submit = wx.Button(self.panel, -1, '执行', size=(120, 40), pos=(580, 250))
        # 菜单翻页
        self.pre_page = wx.Button(self.panel, -1, '上一页', size=(50, 20), pos=(310, 0))
        self.next_page = wx.Button(self.panel, -1, '下一页', size=(50, 20), pos=(360, 0))
        # 设置点击事件
        self.Bind(wx.EVT_BUTTON, self.subMit, self.submit)
        self.Bind(wx.EVT_BUTTON, self.prePage, self.pre_page)
        self.Bind(wx.EVT_BUTTON, self.nextPage, self.next_page)

    def onClick(self, event):
        # 清除控件
        # self.TextCtrl.Clear()
        for sub_text in self.sub_text_li:
            sub_text.Destroy()
        for sub_ctrl in self.sub_ctrl_li:
            sub_ctrl.Destroy()
        if self.sub_text_li:
            self.sub_text_li = []
            self.sub_ctrl_li = []
        for data_list in self.res_array:
            button = event.GetEventObject()
            column_num = 0
            row_num = 0
            # 渲染菜单按钮
            if data_list[0] == button.GetLabel():
                variable_name_li = data_list[2].split(',')
                variable_default_li = data_list[4].split(',')
                # 渲染控件
                for index, variable_name in enumerate(variable_name_li):
                    # 一页展示最多5个按钮
                    if index != 0 and index % 5 == 0:
                        column_num += 1
                        row_num = 0
                    sub_text = wx.StaticText(self.panel, -1, variable_name,
                                             ((column_num * 300) + 20, (row_num * 40) + 100))
                    self.sub_text_li.append(sub_text)
                    sub_ctrl = wx.TextCtrl(self.panel, value='', size=(120, 25),
                                           pos=((column_num * 300) + 100, (row_num * 40) + 95))
                    sub_ctrl.AppendText(variable_default_li[index])
                    self.sub_ctrl_li.append(sub_ctrl)
                    row_num += 1
        # 当前选项卡
        self.now_tab_text = wx.StaticText(self.panel, -1, event.GetEventObject().GetLabel(),
                                          (300, 60))
        self.sub_text_li.append(self.now_tab_text)

    # 上一页
    def prePage(self, event):
        if self.page_num == 0:
            return ''
        else:
            # 清除控件
            for sub_text in self.sub_text_li:
                sub_text.Destroy()
            for sub_ctrl in self.sub_ctrl_li:
                sub_ctrl.Destroy()
            for tab_button in self.tab_button_li:
                tab_button.Destroy()
            if self.sub_text_li:
                self.sub_text_li = []
                self.sub_ctrl_li = []
            if self.tab_button_li:
                self.tab_button_li = []
            self.page_num -= 1
            self.get_tab_button()

    # 下一页
    def nextPage(self, event):
        if self.page_num == self.max_page:
            return ''
        else:
            # 清除控件
            for sub_text in self.sub_text_li:
                sub_text.Destroy()
            for sub_ctrl in self.sub_ctrl_li:
                sub_ctrl.Destroy()
            for tab_button in self.tab_button_li:
                tab_button.Destroy()
            if self.sub_text_li:
                self.sub_text_li = []
                self.sub_ctrl_li = []
            if self.tab_button_li:
                self.tab_button_li = []
            self.page_num += 1
            self.get_tab_button()

    # 遍历data
    def get_tab_button(self):
        # 遍历data
        for index, data_list in enumerate(self.res_array[self.page_num:self.page_num + 5]):
            # 动态生成按钮
            exec('self.{0} = wx.Button(self.panel, -1, data_list[0], size=(120, 40), pos=(index * 150, 20))'.format(
                data_list[3]))
            # 设置点击事件
            self.Bind(wx.EVT_BUTTON, self.onClick, getattr(self, data_list[3]))
            getattr(self, data_list[3]).SetDefault()
            self.tab_button_li.append(getattr(self, data_list[3]))

    def subMit(self, event):
        # self.TextCtrl.Clear()
        data_dic = {'TextCtrl': self.TextCtrl}
        try:
            now_tab = self.now_tab_text.GetLabel()
        except Exception as e:
            self.TextCtrl.AppendText('\n请选择执行项')
            return None

        for data_list in self.res_array:
            variable_li = data_list[1].split(',')
            if data_list[0] == now_tab:
                for index, item in enumerate(variable_li):
                    if self.sub_ctrl_li[index].GetValue():
                        data_dic[item] = self.sub_ctrl_li[index].GetValue()
                    else:
                        # 必填校验
                        self.TextCtrl.AppendText('\n请录入必填项{0}'.format(item))
                        return None
                exec("threading.Thread(target={0}, kwargs=data_dic).start()".format(data_list[3]))
                self.TextCtrl.AppendText('\n{0}开始执行'.format(data_list[0]))
                return None


if __name__ == '__main__':
    # 创建一个应用程序对象,用于消息循环
    app = wx.App()
    # 创建一个窗体
    frame = Frame(None, "Project")
    frame.Show()
    app.MainLoop()

配置文件,所有的前端展示按钮/录入项及执行哪个函数都搁这里面搞;

# 操作界面按钮
res_array = [['求和',  # 菜单名称
              'number_1,number_2',  # 录入项变量名
              '请输入数字1,请输入数字2',  # 录入项展示名
              'func_sum',  # 执行方法名
              '1,2'],  # 默认值
             ['求积',  # 菜单名称
              'number_1,number_2',  # 录入项变量名
              '请输入数字1,请输入数字2',  # 录入项展示名
              'func_mul',  # 执行方法名
              '3,10']  # 默认值
             ]

执行函数具体内容;

def func_sum(**kwargs):
    ret = int(kwargs['number_1']) + int(kwargs['number_2'])
    # 打印结果
    kwargs['TextCtrl'].AppendText('\n结果为:{0}'.format(ret))


def func_mul(**kwargs):
    ret = int(kwargs['number_1']) * int(kwargs['number_2'])
    # 打印结果
    kwargs['TextCtrl'].AppendText('\n结果为:{0}'.format(ret))

执行效果:

写的糙勿喷。感谢各位大佬。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值