Python学习笔记--exe文件打包与UI界面设计

2023-11-18

前言

又是半年时间过去了,终于有有时间摸鱼学一点python了。本次练习主要针对之前写过的自动打卡脚本,将其打包成exe文件,并加上UI界面。其实对于自动打卡这个功能来说,UI界面并不是必需品,加上了界面反而有些麻烦。

一、基于tkinter实现的UI设计

1.1 库的选择及思路

我比较熟悉的UI相关的库主要有easygui,tkinter,pyqt5这些。之前学习的时候尝试过easygui,pyqt感觉又过于复杂,所以本次打算以tkinter为基础来进行练习。

代码大体可以分为两部分,功能实现部分以及界面设置部分。实现功能的主要代码采用之前写过的自动打卡代码,因为加入了界面,因此要进行一定程度的改动,加入互交逻辑。而界面设计部分主要涉及到输入,按钮,位置布置等方面以及所需调用的功能函数。

1.2 定位方法的选用

先放一下第一版很丑的设计:

狗看了都摇摇头

其中,label,entry,button及其相应的功能使用起来还是比较简单的,麻烦的点就在于定位

tkinter提供了三种定位方式:pack(),grid(),place(),具体的区别与应用网上都有,就不再赘述了,主要讲讲我的体会。

上图这个很丑的布局就是用grid()方法进行布置的。该方法类似于在一个隐形的excel表格上安排各个控件,每个控件分别占据第几行第几列,最终组成界面。

登录信息 分隔符
账号 输入框
密码 输入框

比如上图中左上角的登录信息就位于0行0列,而下方的账号就是1行0列,登录信息右侧的分割线则是0行1列,依此类推。

简单了解之后,以我粗浅的理解发现了几点问题:

  1. 每个单元格的大小尺寸很难去进行自定义,布置好控件之后,尺寸基本上是自动设置,不能随心所欲的设定每个格子内控件的大小

  2. 它的单元格之间都是紧凑排列的,什么意思呢,比如在1行1列布置了控件,想要在3行1列布置另一个控件,中间空置一行是做不到的。这种情况下等同于布置在2行1列,会自动忽略未布置控件的行或列。这就有一种往一起堆的趋势,有点类似pack()的感觉。

  3. 回过头来看,也许先布置多个frame再分别在各个frame上进行布局能够解决控件对齐等问题(之后所用的pack()方法就是使用了多个frame进行布置)。

最终采用了最简单的pack()方法配合frame控件进行设计,网上说这种方式有点像堆积木,我觉得更像是华容道的棋盘,每一个控件的布局就像一颗棋子。值得一提的是,根据网上大佬分享的经验,不同布局方式之间不能混用,我并没有进行测试,所有位置布局都采用pack()的方法进行。

1.3 Frame控件

在这里插入图片描述

这是个很基础也很常用的控件,菜鸟上的介绍是作为一个容器,来盛放其他控件。根据我的理解,如果建立一个最简单的界面,并直接布置各个控件,就相当于该界面上存在一个frame,各个控件都是布置于其上的。

上图就是一个最简单的界面,而下图中则相当于将Label,Entry控件布置在了一个frame之上。对于非常简单的界面来说,可以不必使用frame控件。

在这里插入图片描述
关于Frame控件,一个比较典型的应用场景就是配合Notebook控件来生成不同标签页(需要import tkinter.ttk),具体效果如下:

在这里插入图片描述

在这里插入图片描述
为了使每一个标签页下都对应不同的内容,就需要每一标签页面都设置不同的Frame来承载不同的控件。如登录信息和打卡信息这两个标签页,需要分别设置frame进行绑定。

	notebook = ttk.Notebook(window)
    frame_1, frame_2, frame_3, frame_4, frame_5 = [tk.Frame() for i in range(5)]
    notebook.add(frame_1, text='说明')
    notebook.add(frame_2, text='登录信息')
    notebook.add(frame_3, text='打卡信息')
    notebook.add(frame_4, text='手动设置')
    notebook.add(frame_5, text='打卡设置')
    notebook.pack(padx=10, pady=5, fill=tkinter.BOTH, expand=True)
    notebook.select(4)  # 初始页面选择 #

以上代码可生成5个空白的标签页以及5个frame,接下来就是对每个页面进行布局。

由于pack()方法本身的特点(具体细节见:用tkinter.pack设计复杂界面布局,讲的非常好!),如果界面上存在较多的控件,最好使用frame先占位,再将控件布置在frame之上,可以达到较好的效果。

举个栗子,上图登录信息页面中,包括了以下三种控件:

  • Label : 账号,密码

  • Entry : 账号密码后对应输入框

  • Checkbutton : 隐藏密码勾选框

假设该页面对应frame_2,在其上再设置3个frame,分别放置账号及其输入框密码及其输入框以及隐藏密码勾选框:

	frame_21, frame_22, frame_23 = [tk.Frame(frame_2) for i in range(3)]
    frame_21.pack()
    frame_22.pack()
    frame_23.pack()

准备并布置好frame后即可进行各个控件的布置:

	str_v21, str_v22 = tk.StringVar(), tk.StringVar()

    f21_label0 = tk.Label(frame_21)
    f21_label0.pack(padx=10, pady=5, side='top')
    f21_label1 = tk.Label(frame_21, text='账号')
    f21_label1.pack(padx=10, pady=5, side='left', anchor='nw')
    f21_entry1 = tk.Entry(frame_21, textvariable=str_v21)
    f21_entry1.pack(padx=10, pady=5, side='top', anchor='n')

    f22_label0 = tk.Label(frame_22)
    f22_label0.pack(padx=10, pady=5, side='top')
    f22_label2 = tk.Label(frame_22, text='密码')
    f22_label2.pack(padx=10, pady=5, side='left', anchor='nw')
    f22_entry2 = tk.Entry(frame_22, textvariable=str_v22, show='*')
    f22_entry2.pack(padx=10, pady=5, side='top', anchor='n')

    f22_label3 = tk.Label(frame_22)
    f22_label3.pack(padx=10, pady=5, side='top')

    var1 = tk.IntVar()  # 复选框用变量 #
    var1.set(1)  # 初始化 #

    f23_cb1 = tk.Checkbutton(frame_23, text='隐藏密码', variable=var1, command=pwd_state)
    f23_cb1.pack(padx=10, pady=5)

其中label0是拿来占空白位用的,使用pady=进行填充也可以。(有空可以精简一下这部分代码)

1.4 变量设置

主要涉及两部分内容:

  1. 打卡过程中的数据交换 : 包括历史信息的获取,本地信息的提交,如何将这一部分数据填入或从输入框中提取出来。

  2. 界面本身的设置 : 一些功能选择状态的记忆等。

1.3中登录信息页的设计中包含了三个变量:str_v21, str_v22, var1,和两种类型:tk.StringVar(), tk.IntVar(),其中:

  • tk.StringVar()用来实时接收和传递字符串类型的数据,即输入框中的内容,类似于一个中转站,能够实现所见(输入框中显示内容)即所得(变量赋值)

  • tk.IntVar()用来作为功能状态判别的开关,通过改变变量的值来控制功能的启停。以复选框为例:变量为1则设置为已勾选状态,为0则设置为未勾选状态。

1.5 批量设置

在这里插入图片描述
在该页面上,共有11个Label和Entry,分别布置在11个Frame之上。重复度较高,可以考虑批量生成并布置。

	f3_info = ['   目前所在地', '位置是否变化', '      身体状况',
               '接触人员状况', '      隔离情况', '      今日体温',
               '个人手机号码', '家人联系方式', '      行程时间', '      隔离地点', '      打卡位置'
               ]
    f3_list, f3_strv_list, f3_label1_list, f3_entry0_list, control_list1, control_list2 = [[] for i in range(6)]

    # 批量生成label,entry变量名
    for i in range(1, 12):
        exec('f3_{} = "frame_3{}"'.format(i, i))
        exec('f3_list.append(f3_{})'.format(i))
        exec('f3_label1{} = "f3{}_label1"'.format(i, i))
        exec('f3_label1_list.append(f3_label1{})'.format(i))
        exec('f3_entry0{} = "f3{}_entry0"'.format(i, i))
        exec('f3_entry0_list.append(f3_entry0{})'.format(i))
        exec('f3_strv{} = "strv_3{}"'.format(i, i))
        exec('f3_strv_list.append(f3_strv{})'.format(i))

    # 批量布置位置
    for x, y, z, j, k in zip(f3_label1_list, f3_entry0_list, f3_strv_list, f3_list, f3_info):
        j = tk.Frame(frame_3)
        j.pack(expand=True)
        z = tk.StringVar()
        control_list1.append(z)  # 控制状态用 #
        x = tk.Label(j, text=k)
        x.pack(padx=10, pady=5, side='left', anchor='nw')
        y = tk.Entry(j, textvariable=z)
        y.pack(padx=10, pady=5, side='top', anchor='n')
        control_list2.append(y)   # 控制状态用 #

批量生成变量名可以利用exec()函数,control_list用于控制输入框输入状态及输入信息提取,通过设置textvariable与对应的变量(tk.StringVar()类型)即可实现数据的传递。

1.6 Text文本框

Text控件可以用来进行信息说明或进度提示。

在这里插入图片描述

图上所展示的Text控件处于只读state='disabled')状态,只作为信息展示之用。Text控件边框样式选择也可以通过relief=属性实现。

如果需要带有滚动条的文本框,可以使用scrolledtext(需要from tkinter import scrolledtext),具体使用方法与Text差不多:scrolledtext.ScrolledText(),Text的一些属性与方法也可以使用。效果如下:

在这里插入图片描述

1.7 总体界面设计

每个页面布局如下:

说明页:主要对使用方法和使用过程中的注意事项进行说明。

在这里插入图片描述

登录信息页:账号密码的输入以及是否以 *****的形式隐藏密码。若勾选则不显示明文密码,默认勾选隐藏密码。

在这里插入图片描述

打卡信息页:打卡所需信息的传递。

在这里插入图片描述

手动设置页:如果需要核对或修改打卡信息时可能使用到的功能。

在这里插入图片描述

打卡设置页

  • 保存信息 : 打卡信息,功能状态的保存(存在配置文件中)。

  • 重置信息 : 清空所有输入框内信息(没啥用。。)。

  • 一键打卡 : 点一下,就打卡(人被杀,就会死 )。

  • 自动打卡 : 勾选后,打开软件自动进行打卡。

  • 进度栏 : 显示运行状态,操作时间及结果,错误提示等。

在这里插入图片描述

1.8 功能函数

界面设计的结束,只完成了一半的任务。现在的软件还只是一个空壳,无法实现任何功能。真正的核心任务:完成打卡及配套功能还需要构造相应的函数。

涉及到打卡登录部分的功能代码基本来自于我上篇文章(Python学习笔记–每日健康打卡及离校报备)所写,有一定程度改动。

  1. Text中输出提示信息 :方便查看任务进度,状态以及操作时间。方便其他功能函数运行后调用,并自定义输出内容。
    def notice(text):
    	now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())  # 保存操作时间 #
        f53_text.configure(state='normal')
        f53_text.insert('insert', '[' + now + ']' + '    ' + text + '\n')  # 带上操作时间 #
        f53_text.configure(state='disabled')
  1. 保存输入信息以及软件设置。如果不加入此功能,每次打开软件都是空白一片,需要重新填写一遍,软件也就失去了意义。将所需信息写入到配置文件(info.ini)中,每次打开软件进行读取即可实现历史信息的保存。
    def save_info():
        global save_value
        save_value = []

        save_value.append(str_v21.get())  # 获取输入信息 #
        save_value.append(str_v22.get())
        for vs in control_list1:
            save_value.append(vs.get())
        save_value.append(str(var3.get()))

        with open("info.ini", "w") as f:  # 信息写入配置文件 #
            for vb in save_value:
                f.write(vb)
                f.write('\n')

        notice('保存成功!')
  1. 软件的初始化 : 每次打开软件进入界面前所运行的函数,包括配置文件的读取,状态设定等。如第一次运行,则会创建空白配置文件;如果目录下已有配置文件则读取其中数据。
    def start():
        notice('初始化中,检测配置文件...')
        tf = os.path.exists('info.ini')  # 检测配置文件,不存在则创建 #
        if tf:
            notice('正在读取配置文件...')
            s_list = []
            count = 2
            with open("info.ini", "r") as ft:
                data = ft.readlines()
                for line in data:
                    line = line.strip('\n')
                    s_list.append(line)
            # 读取保存的配置
            str_v21.set(s_list[0])
            str_v22.set(s_list[1])
            for e in control_list1:
                e.set(s_list[count])
                count += 1
            var3.set(s_list[-1])
            bt_state()
            notice('初始化成功!')
            if var3.get() == 1:  # 是否自动打卡 #
                onekey_checkin()
        else:
            notice('未检测到配置文件,将自动创建...')
            with open("info.ini", "w") as ff:  # 新建空白配置文件 #
                ff.write('\n\n\n\n\n\n\n\n\n\n\n\n\n')
            notice('配置文件创建成功!')
  1. 控制是否显示密码 : 改变密码明文\加密(*****)状态。
    def pwd_state():
        if var1.get() == 1:
            f22_entry2.configure(show='*')
        if var1.get() == 0:
            f22_entry2.configure(show='')
  1. 输入框状态设定 : 在可输入\只读状态之间切换。由手动设置页中进行选择,默认自动设置。(其实应该合在一起,但这几个函数都是之前版本删改之后的结果,懒得动就直接用了。。)
    def bt_state():
        if var2.get() == 1:
            active_entry()
            f44_button1.configure(state='normal')
            f44_button2.configure(state='normal')
        if var2.get() == 2:
            disable_entry()
            f44_button1.configure(state='disabled')
            f44_button2.configure(state='disabled')
            
    # 禁止修改信息       
    def disable_entry():
        for each in control_list2:
            each.configure(state='readonly')

    # 允许修改信息
    def active_entry():
        for each in control_list2:
            each.configure(state='normal')
  1. 清空输入框内信息 : 不知道为啥要写这个功能,意义不明。。。(了解了一下delete方法)
    def reset_entry():  # 写这个功能有啥用?? #
        notice('已清空信息!')
        active_entry()
        f21_entry1.delete(0, 'end')
        f22_entry2.delete(0, 'end')
        for each in control_list2:
            each.delete(0, 'end')
  1. 关闭软件自动保存数据 : 懒人福音。核心在于protocol(),本质上是捕获软件退出时发出的命令,将destory()方法替换为可以自动保存的closewin()方法。
	window.protocol('WM_DELETE_WINDOW', closewin)
    def closewin():
        save_info()
        window.destroy()
  1. 登录打卡系统 : (这位更是重量级 ) 不登录你打个屁卡?利用StringVar().get()方法获取输入的帐号以及密码并提交。需要注意的是:StringVar()实例化后并不能直接调用,直接使用无法获取变量的赋值,需要用到get()。登陆成功后会返回用户信息(学院,班级,姓名,打卡日期),失败则会返回错误原因。
    def login():
        urllib3.disable_warnings()  # SSL验证错误,忽略 #

        data_login['user_account'] = str_v21.get()
        data_login['user_password'] = str_v22.get()

        login_res = requests.post(login_url, headers=headers, verify=False, data=json.dumps(data_login))  # 提交登录请求 #
        global cookie   # 后面要用到,设为全局变量,其他全局变量相同 #
        cookies = login_res.cookies
        cookie = requests.utils.dict_from_cookiejar(cookies)
        login_res_json = login_res.json()

        if login_res_json['code'] == 200:
            notice('登录成功!')
        else:
            notice('登录失败!')
            notice('错误原因:%s' % (login_res_json['msg']))

        date_res = requests.post(date_url, headers=headers, verify=False, cookies=cookie)
        date_res_json = date_res.json()

        # 获取登陆用户信息
        user_class = date_res_json['datas']['user_info']['bj']
        user_institute = date_res_json['datas']['user_info']['bm']
        user_name = date_res_json['datas']['user_info']['user_name']
        global today, yesterday, stats
        today = date_res_json['datas']['hunch_list'][0]['date1']
        yesterday = date_res_json['datas']['hunch_list'][1]['date1']
        stats = 0

        if date_res_json['datas']['hunch_list'][0]['state'] == 1:
            stats += 1
            notice('来自 %s,%s 的%s,今日(%s)已经打卡!' % (user_institute, user_class, user_name, today))
        else:
            notice('来自 %s,%s 的%s,今日(%s)尚未打卡!' % (user_institute, user_class, user_name, today))
  1. 获取历史打卡信息 : 重中之重,点一下直接获取所有需要的打卡信息。(因为学校所使用的打卡系统的特点,打卡信息基本不会变化,因此获取之前填报的打卡信息是最方便的办法。唯一需要修改的地方就在打卡位置以及是否变动这些,可以通过手动获取并修改保存的方法,最大程度上节约时间成本。)

    需要注意的是上篇文章提到的打卡过程中涉及到的3次post请求,实际上是4次。分别是登录(login),获取日期(getHomeDate),获取历史打卡信息(getPunchForm)以及提交今日打卡信息(punchForm)。除了获取日期外,均需要在post过程中传入数据data=json.dumps())才能得到正确的结果。

    def get_history():
        active_entry()

        history_list = []
        key_list = []

        login()
        date = {"date": yesterday}
        res_history = requests.post(history_url, headers=headers, verify=False, cookies=cookie, data=json.dumps(date))
        res_history_json = res_history.json()

        for i in range(11):
            history_list.append(res_history_json['datas']['fields'][i]['user_set_value'])
            key_list.append(res_history_json['datas']['fields'][i]['field_code'])
        for j, k in zip(control_list1, history_list):
            j.set(k)  # 获取数据填入表格 #
        # 组合生成提交数据所需dict
        punch_dict = dict(zip(key_list, history_list))
        punch_form_dict = {'punch_form': str(punch_dict)}
        date_dict = {'date': today}
        global data_punch
        data_punch = dict(punch_form_dict, **date_dict)
  1. 一键打卡 : 套娃+提交数据。
    def onekey_checkin():
        get_history()
        if stats == 0:
            res_submit = requests.post(submit_url, headers=headers, verify=False, data=json.dumps(data_punch),
                                       cookies=cookie)
            res_submit_json = res_submit.json()

            if res_submit_json['code'] == 200:
                notice('打卡成功!')
            else:
                notice('打卡失败!')
                notice('错误来源:%s' % (res_submit_json['msg']))
        else:
            notice('今日已经打卡,请勿重复打卡!')
  1. 手动打卡 : 没什么好说的,套娃就完事了。
    def checkin():
        login()
        list_key = ['mqszd', 'sfybh', 'mqstzk', 'jcryqk', 'glqk', 'jrcltw', 'sjhm', 'jrlxfs', 'xcsj', 'gldd', 'zddw']
        list_value = []

        for i in control_list1:
            list_value.append(i.get())
        punch_dict = dict(zip(list_key, list_value))
        punch_form_dict = {'punch_form': str(punch_dict)}
        date_dict = {'date': today}
        data_punch = dict(punch_form_dict, **date_dict)

        if stats == 0:
            res_submit = requests.post(submit_url, headers=headers, verify=False, data=json.dumps(data_punch),
                                       cookies=cookie)
            res_submit_json = res_submit.json()

            if res_submit_json['code'] == 200:
                notice('打卡成功!')
            else:
                notice('打卡失败!')
                notice('错误来源:%s' % (res_submit_json['msg']))
        else:
            notice('今日已经打卡,请勿重复打卡!')

1.9 使用效果

打开软件首先输入账号密码。

在这里插入图片描述

点击一键打卡。

在这里插入图片描述

查看获取的历史信息。

在这里插入图片描述

二、 使用pyinstaller打包exe文件

2.1 pyinstaller的参数设置

在这里插入图片描述

默认情况下,使用pyinstaller打包为exe文件后,运行时都会带有一个cmd窗口。如果没有设计图形界面,则需要用该窗口进行互交,但带有界面的软件运行时就不需要这个窗口了。

解决办法(Pycharm下) : 点击File–Settings–Tools–External Tools,双击pyinstaller。在出现的窗口中找到Arguments,加入 -w即可。

2.2 打包方式的选择

同样可以通过设置Arguments参数进行打包方式的选择。

  • -D :生成一个文件夹,里面是多文件模式,启动快,但体积过大(只导入了不到10个包,居然达到了20多M)。

在这里插入图片描述

在这里插入图片描述

  • -F : 仅生成一个文件,不暴露其他信息,启动较慢(大小接近10M,启动较多文件方式慢上几秒)。

在这里插入图片描述

单文件模式方便使用,启动速度可以忽略,最终选择生成单文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python学习笔记--exe文件打包与UI界面设计 的相关文章

  • 为什么 Python 在导入脚本时只保存脚本的字节码?

    既然执行Python字节码会比运行原始源代码更快 因为Python不需要重新编译 为什么Python在导入脚本时只保存编译后的字节码呢 为每个执行的脚本保存 pyc 文件不是更好吗 无论如何 Python 解释器的启动时间都需要时间 即使您
  • 如果 Excel 文件是由程序创建的,Pandas read_excel 对于具有简单公式的单元格返回 nan [重复]

    这个问题在这里已经有答案了 I use pd read excel读取由以下命令创建的 excel 文件openpyxl并从一个网址下载 解析后的数据框将给出nan如果单元格值是公式 which formula is simply 100
  • str.translate 与 str.replace - 何时使用哪一个?

    何时以及为什么使用前者而不是后者 反之亦然 目前尚不完全清楚为什么有些人使用前者以及为什么有些人使用后者 它们有不同的目的 translate只能用任意字符串替换单个字符 但一次调用可以执行多次替换 它的参数是一个特殊的表 它将单个字符映射
  • 键入的完整命令行

    我想获得输入时的完整命令行 This join sys argv 在这里不起作用 删除双引号 另外 我不想重新加入已解析和拆分的内容 有任何想法吗 你太迟了 当键入的命令到达 Python 时 您的 shell 已经发挥了它的魔力 例如 引
  • 来自 pandas 数据帧的烛台图,用日期替换索引

    此代码给出了带有移动平均线的烛台图 但 x 轴位于索引中 我需要 x 轴位于日期中 需要做什么改变 import numpy as np import pandas as pd import matplotlib pyplot as plt
  • 将 Python Pandas DataFrame 写入 Word 文档

    我正在努力创建一个使用 Pandas DataFrames 的 Python 生成的报告 目前我正在使用DataFrame to string 方法 但是 这会作为字符串写入文件 有没有办法让我实现这一目标 同时将其保留为表格 以便我可以使
  • 用 Python 绘制直方图

    我有两个列表 x 和 y x 包含字母表 A Z Y 包含它们在文件中的频率 我尝试研究如何在直方图中绘制这些值 但在理解如何绘制它方面没有成功 n bins patches plt hist x 26 normed 1 facecolor
  • Py2exe - Pmw WindowsError:[错误 3]

    我正在尝试使用 Py2exe 构建独立的可执行文件 我已经导入了 Pmw 类 当我运行独立可执行文件时 出现以下错误 Traceback most recent call last File py line 9 in
  • 在请求中设置端口

    我正在尝试利用cgminer使用 Python 的 API 我对利用requests图书馆 我了解如何做基本的事情requests but cgminer想要更具体一点 我想缩小 import socket import json sock
  • 将 window.location 传递给 Flask url_for

    我正在使用 python 在我的页面上 当匿名用户转到登录页面时 我想将一个变量传递到后端 以便它指示用户来自哪里 发送 URL 因此 当用户单击此锚链接时 a href Sign in a 我想发送用户当前所在页面的当前 URL
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • python Recipe:列出最接近等于值的项[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 考虑像这样的列表 0 3 7 10 12 15 19 21 我想获得最接近任何值的最近的最小数字 所以如果我通过4 我会得到3 如果我
  • Django 将 JSON 数据传递给静态 getJSON/Javascript

    我正在尝试从 models py 中获取数据并将其序列化为views py 中的 JSON 对象 模型 py class Platform models Model platformtype models CharField max len
  • 无需访问 Internet 即可部署 Django 的简单方法?

    我拥有的是使用 Django 开发的 Intranet 站点的开发版本以及放置在 virtualenv 中的一些外部库 它运行良好 我可以在任何具有互联网连接的计算机上使用相同的参数 使用 pip 轻松设置 virtualenv 但是 不幸
  • 如何使用 enumerate 来倒数?

    letters a b c 假设这是我的清单 在哪里for i letter in enumerate letters 将会 0 a 1 b 2 c 我怎样才能让它向后枚举 如 2 a 1 b 0 c 这是一个很好的解决方案并且工作完美 i
  • python中有没有一种方法可以将存储在列表中的正则表达式模式列表应用到单个字符串?

    我有一个正则表达式模式列表 存储在列表类型中 我想将其应用于字符串 有谁知道一个好方法 将列表中的每个正则表达式模式应用于字符串 和 如果匹配 则调用与列表中该模式关联的不同函数 如果可能的话我想用 python 来做这件事 提前致谢 im
  • Python 相当于 Scala 案例类

    Python 中是否有与 Scala 的 Case Class 等效的东西 就像自动生成分配给字段而无需编写样板的构造函数一样 当前执行此操作的现代方法 从 Python 3 7 开始 是使用数据类 https www python org
  • 没有名为“turtle”的模块

    我正在学习并尝试用Python3制作贪吃蛇游戏 我正在进口海龟 我正在使用 Linux mint 19 PyCharm python37 python3 tk Traceback most recent call last File hom
  • pandas.read_fwf 忽略提供的数据类型

    我正在从文本文件导入数据框 我想指定列的数据类型 但 pandas 似乎忽略了dtype input 一个工作示例 from io import StringIO import pandas as pd string USAF WBAN S
  • 使用 MPI 的 Allreduce 对 Python 对象求和

    我正在使用使用 Python 中的字典和计数器构建的稀疏张量数组操作 我想让并行使用这个数组操作成为可能 最重要的是 我最终在每个节点上都有计数器 我想使用 MPI Allreduce 或另一个不错的解决方案 将其添加在一起 例如 使用计数

随机推荐

  • 奇异谱分解轴承故障诊断代码编写

    答 我可以为您提供一些建议 以帮助您编写奇异谱分解轴承故障诊断代码 1 首先 要确定故障类型 以便确定诊断策略 2 然后 可以使用多种故障诊断技术 包括奇异谱分析 以及其他故障诊断技术 3 为了更好地掌握故障特征 可以使用相关的轴承数据库
  • 最近在学动态规划,很有意思的算法(1)拿金币

    问题描述 有一个N x N的方格 每一个格子都有一些金币 只要站在格子里就能拿到里面的金币 你站在最左上角的格子里 每次可以从一个格子走到它右边或下边的格子里 请问如何走才能拿到最多的金币 输入格式 第一行输入一个正整数n 以下n行描述该方
  • 代码扫描工具对比

    1 概述 随着网络的飞速发展 各种网络应用不断成熟 各种开发技术层出不穷 上网已经成为人们日常生活中的一个重要组成部分 在享受互联网带来的各种方便之处的同时 安全问题也变得越来越重要 黑客 病毒 木马等不断攻击着各种网站 如何保证网站的安全
  • asm:常见指令大全

    常见指令大全 算数指令 INC 指令 DEC 指令 ADD 指令 SUB指令 MUL指令 IMUL指令 DIV指令 IDIV指令 逻辑指令 AND指令 OR指令 XOR 指令 TEST指令 NOT指令 交换指令 xchg 比较指令 CMP指
  • MySQL(二)——基本操作

    MySQL操作 数据库操作 创建数据库 列出 MySQL数据库列表 使用数据库 判断当前所处的数据库 删除数据库 数据库表操作 数据库中的所有表 创建数据表 查询表结构 查询指定表的建表语句 修改表名 删除表单 删除该表并重新再创建 格式化
  • VUE锚点跳转增加滑动效果

    首先我通过直接的锚点跳转是实现不了滑动效果 所以首先实现锚点的跳转效果 先给点击的地方 设置一个点击事件 a 跳转 a 然后是被跳转的地方添加 class industry
  • 只需6行代码教你使用Spire.Doc在Java中将 Word 转为 Tiff

    Spire Doc for Java 是一款专业的Java Word组件 开发人员使用它可以轻松地将Word文档创建 读取 编辑 转换和打印等功能集成到自己的Java应用程序中 本文介绍如何使用Spire Doc for Java将Word
  • linux:ubuntu命令行扩容

    参考 ubuntu 20 04 逻辑卷 ext4 文件系统扩容 mob604757006a49的技术博客 51CTO博客 总结 准备步骤 链接里没有说明 我参考了其他的帖子增加的一步 1 关闭虚拟机 右键虚拟机 选择 设置 2 在虚拟机设置
  • android 富文本框架_史上最全 Appium 自动化测试从入门到框架实战精华学习笔记(二)

    本文为霍格沃兹测试学院学员学习笔记 进阶学习文末加群 本系列文章汇总了从 Appium 自动化测试从基础到框架高级实战中 所涉及到的方方面面的知识点精华内容 如下所示 希望对大家快速总结和复习有所帮助 Appium 自动化测试从基础到框架实
  • python网络安全论文题目_计算机科学与技术专业毕业论文参考题目.doc

    感谢你的欣赏 计算机科学与技术专业 毕业论文参考题目 一 论文参考题目 基于定位和在线绘图的签到考勤系统的设计与实现 基于 ASP NET 技术的校园网络自助报修系统的设计与实现 基于 HTML5 的互动抽取系统的设计与实现 基于 Web
  • React的State Hook用法详解

    一 State Hook是啥 State Hook 就是指 useState 这个特殊函数 让你不用编写class 就可以使用state特性 换言之就是让 函数组件 拥有 state 特性 对数据进行动态更新 二 class中的state
  • RHCE(chrony服务器)

    chrony服务器 chrony服务器是一个开源自由的网络时间协议NTP的客户端和服务器的软件 他能让计算机保持系统时钟和时钟服务器保持同步 让计算机保持精确的时间 chrony也可以作为服务端软件为其他计算机提供时间同步服务 chrony
  • 输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

    例 输入为18时 输出为3 4 5 6 5 6 7 include
  • Tomcat 配置 闪退 catalina.bat start

    过年的时候配置好的Tomcat 今天一用竟然启动不了 我晕 java home catalina base catalina home 全部是原来的配置 没有修改过 为什么不能用了那 遇到的问题如下 1 启动Tomcat在cmd中输入 ca
  • SpringBoot整合Mybatis注解实战(一)-- 插入数据

    1 数据库数据表的创建 1 首先 在本地数据库中创建一个新数据库 再此命名为test mybatis 1 创建一个数据表user 创建脚本如下 user表创建脚本 CREATE TABLE user id int 11 unsigned N
  • unity期末大作业 搬运东西过河 益智游戏

    unity期末大作业 搬运东西过河 益智游戏 详细情况如下动态图 点我下载 https download csdn net download weixin 43474701 75859840
  • 从“星空”主题绘画系统出发寻求绘画的可能性

    引言 对于绘画的定义 众说纷纭 百度词条上的绘画是这样的 绘画 是指用笔 板刷 刀 墨 颜料等工具材料 在纸 纺织物 木板 墙壁等平面 二度空间 上塑造形象的艺术形式 2016年吕澎在 论绘画 中说 知识与感觉是评估绘画的两个基本出发点 而
  • Redis有哪些数据类型?

    它主要提供了5种数据类型 字符串 string 哈希 hash 列表 list 集合 set 有序集合 zset Redis还提供了Bitmap HyperLogLog Geo类型 但这些类型都是基于上述核心数据类型实现的 5 0版本中 R
  • elasticsearch部署过程中各种报错解析

    elasticsearch bootstrap StartupException java lang RuntimeException can not run elasticsearch as root ES不能能使用root用户直接运行
  • Python学习笔记--exe文件打包与UI界面设计

    exe文件打包与UI界面设计 前言 一 基于tkinter实现的UI设计 1 1 库的选择及思路 1 2 定位方法的选用 1 3 Frame控件 1 4 变量设置 1 5 批量设置 1 6 Text文本框 1 7 总体界面设计 1 8 功能