文章目录
前言
一.项目来源
公司需要在表单字段中调用其它数据库数据,需要使用ajax脚本接口调取
对此,每次修改对应的数据并一一核对,程序容易出错,也比较麻烦,费时间
因此,对于这种偏重复的工作我写了一个程序:“用代码写代码”
二.项目简介
采用最简单的方式,拼接并修改对应的代码,使用pandas读取excal表格数据并生成在代码对应的变量中,使用tkinter做gui界面,最终将功能打包为exe文件给其它人用
三.运行效果
将数据写入excal中,运行程序调用文件生成如下:
无疑对于巨多字段对应可以快速生成,提高效率
四.核心代码介绍
1.使用pandas定位表格的行列坐标
使对应的列表为需要使用的变量,如下,主要根据excal中列的数进行for循环读取对应的数据并保存在对应的列表变量中
# 选择文件安放的位置
def get_file():
# filedialog.askopenfilenames可以返回多个文件名
data_1 = tkinter.filedialog.askopenfilename(title="选择文件")
data = data_1
print('路径为:', data)
x = pd.read_excel(data)
for o in range(0, len(x.columns)):
field_sync_l.append(x.loc[0][o])
# print(x.loc[0][1])
print(field_sync_l)
for o in range(0, len(x.columns)):
field_sync_r.append(x.loc[1][o])
print(field_sync_r)
entry.delete(0, END)
entry.insert(0, data)
2.定义对应的变量,并对应格式
此处复制主要以f’'来赋值对应的字符串,其中,对应\这种符号,很容易被编译器当做换行或者转义符处理,因此,在写入时,我们要使用\\来代替\.
此段代码中d变量需要思考,因考虑每个数据不仅要转换大小写,还要使用’'.join(map(str,x[i]))来将列表转换为字符串,并循环赋值给对应的数组d[i]中
因此i变量增加时,d的下标也要增加,否则会在map中执行多次field_sync_l[i]
为了确保不超出下标索引范围,需要循环给d增加[’ ‘],[’ ‘],[’ ‘]这种形式,其实是元组的一种,而不是[’ ‘,’ ‘,’ '],他们俩区别很大,第一种每一次都是独立下标对应的不同情况,而第二种仅仅是数组遍历下标
d[i] = f""" this.$set(this.formData, "{TABLE_L}-{''.join(map(str, field_sync_l[i])).upper()}", json.{''.join(map(str, field_sync_r[i])).lower()});"""
def in_data():
fun = 'GetDataTableBySql?'
API = '/RunVser/'
TABLE_L = field_sync_l[0] # 使用表
TABLE_R = field_sync_r[0] # 来源表
field_invoke = 'xingming'
field_invoke = field_invoke.upper()
field_source = 'xingming'
# field_sync_l = ['xingming'], ['gonghao']
# field_sync_r = ['Xingming'], ['gonghao']
sql = f"select top 1 * from {TABLE_R} where {field_source}=\\''"
a = """this.ajax.post('{API}{fun}sql={sql}+this.formData["{TABLE_L}-{field_invoke}"]""" \
.format(API=API, fun=fun, sql=sql, TABLE_L=TABLE_L, field_invoke=field_invoke, TABLE_R=TABLE_R)
b = """+'\\'').then((data) => { """
c = """ if (data.success) {
console.log(data.data);
let json = data.data;"""
d = ['']
for i in range(0, len(field_sync_l) - 1):
d.append('')
# print(d)
for i in range(1, len(field_sync_l) - 1):
d[
i] = f""" this.$set(this.formData, "{TABLE_L}-{''.join(map(str, field_sync_l[i])).upper()}", json.{''.join(map(str, field_sync_r[i])).lower()});"""
x = '\n'.join(map(str, d))
e = """ } else {
alert(data.msg);
}
}).catch((e) => {
console.log(e);
});"""
m = f'{a}\n{b}\n{c}\n{x}\n{e}'
code_ares.insert(INSERT, m)
print(m)
最后使用m将各个遍历拼接在一起,即可生成代码
五.完整代码
# _*_ coding:utf-8 _*_
# @Time : 2022/11/17 11:50
# @Author : ice_Seattle
# @File : RC接口.py
# @Software: PyCharm
import ctypes
from tkinter import *
import tkinter as tk
import tkinter.messagebox
import tkinter.filedialog
import time
import pandas as pd
from tkinter import scrolledtext
import win32api
import win32con
def get_all():
win32api.keybd_event(17, 0, 0, 0) # ctrl键位码是17
win32api.keybd_event(65, 0, 0, 0) # c键位码是65
win32api.keybd_event(65, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放按键
win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
def get_copy():
win32api.keybd_event(17, 0, 0, 0) # ctrl键位码是17
win32api.keybd_event(67, 0, 0, 0) # c键位码是67
win32api.keybd_event(67, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放按键
win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
field_sync_l = []
field_sync_r = []
# 选择文件安放的位置
def get_file():
# filedialog.askopenfilenames可以返回多个文件名
data_1 = tkinter.filedialog.askopenfilename(title="选择文件")
data = data_1
print('路径为:', data)
x = pd.read_excel(data)
for o in range(0, len(x.columns)):
field_sync_l.append(x.loc[0][o])
# print(x.loc[0][1])
print(field_sync_l)
for o in range(0, len(x.columns)):
field_sync_r.append(x.loc[1][o])
print(field_sync_r)
entry.delete(0, END)
entry.insert(0, data)
# GUI界面
ctypes.windll.shcore.SetProcessDpiAwareness(1)
ScaleFactor = ctypes.windll.shcore.GetScaleFactorForDevice(0)
window = tk.Tk()
window.title("RC_ajax代码转换器")
window.tk.call('tk', 'scaling', ScaleFactor/75)
width = 800
height = 450
window.geometry(f'{width}x{height}')
# 计算中心坐标点
screen_width = window.winfo_screenwidth() / 2 - width / 2
screen_height = window.winfo_screenheight() / 2 - height / 2
window.geometry(f"+{int(screen_width)}+{int(screen_height)}")
window.config(bg="#FAFAFA") # bg="#000000"
window.tk.call('tk', 'scaling', ScaleFactor/75)
# 设置窗口是否可以变化长宽,默认可变
window.resizable(width=False, height=False)
lb = Label(window, text="Excal文件位置:", font=('微软雅黑', 12), fg='black', bg="#FAFAFA")
lb.place(x=12, y=56)
lb_1 = Label(window, text="代码:", font=('微软雅黑', 12), fg='black', bg="#FAFAFA")
lb_1.place(x=20, y=106)
entry = Entry(window, font=('微软雅黑', 12), width=30, bg='white')
entry.place(x=150, y=60)
code_ares = scrolledtext.ScrolledText(window, width=100, height=10)
code_ares.place(x=15, y=150, width=750, height=250)
def in_data():
fun = 'GetDataTableBySql?'
API = '/RunVser/'
TABLE_L = field_sync_l[0] # 使用表
TABLE_R = field_sync_r[0] # 来源表
field_invoke = 'xingming'
field_invoke = field_invoke.upper()
field_source = 'xingming'
# field_sync_l = ['xingming'], ['gonghao']
# field_sync_r = ['Xingming'], ['gonghao']
sql = f"select top 1 * from {TABLE_R} where {field_source}=\\''"
a = """this.ajax.post('{API}{fun}sql={sql}+this.formData["{TABLE_L}-{field_invoke}"]""" \
.format(API=API, fun=fun, sql=sql, TABLE_L=TABLE_L, field_invoke=field_invoke, TABLE_R=TABLE_R)
b = """+'\\'').then((data) => { """
c = """ if (data.success) {
console.log(data.data);
let json = data.data;"""
d = ['']
for i in range(0, len(field_sync_l) - 1):
d.append('')
# print(d)
for i in range(1, len(field_sync_l) - 1):
d[
i] = f""" this.$set(this.formData, "{TABLE_L}-{''.join(map(str, field_sync_l[i])).upper()}", json.{''.join(map(str, field_sync_r[i])).lower()});"""
x = '\n'.join(map(str, d))
e = """ } else {
alert(data.msg);
}
}).catch((e) => {
console.log(e);
});"""
m = f'{a}\n{b}\n{c}\n{x}\n{e}'
code_ares.insert(INSERT, m)
print(m)
def clear_content():
code_ares.delete('1.0', END)
# 选择路径按钮
btn_select = Button(
window, text="...", font=("华文彩云", 10),
bg='Snow', activeforeground='pink', activebackground='black',
fg="black", command=get_file
)
btn_select.place(x=480, y=60, width=35)
btn_select = Button(
window, text="确认", font=("华文彩云", 10),
bg='Snow', activeforeground='pink', activebackground='black',
fg="black", command=lambda: in_data()
)
btn_select.place(x=520, y=60, width=120)
# 清空按钮
btn_select = Button(
window, text="清空", font=("华文彩云", 10),
bg='Snow', activeforeground='pink', activebackground='black',
fg="black", command=lambda: clear_content()
)
btn_select.place(x=650, y=60, width=120)
# 全选按钮
btn_all = Button(
window, text="全选", font=("华文彩云", 12),
bg='Snow', activeforeground='pink', activebackground='black',
fg="black", command=get_all
)
btn_all.place(x=525, y=400, width=120)
# 复制按钮
btn_copy = Button(
window, text="复制", font=("华文彩云", 12),
bg='Snow', activeforeground='pink', activebackground='black',
fg="black", command=get_copy
)
btn_copy.place(x=645, y=400, width=120)
def get_time():
# 获取当前时间
dstr.set(time.strftime("%H:%M:%S"))
# 每隔 1s 调用一次 get_time()函数来获取时间
window.after(1000, get_time)
dstr = tk.StringVar() # 生成动态字符串
# 利用 textvariable 来实现文本变化
lb_t = tk.Label(window, textvariable=dstr, bg='white', fg='green', font=("微软雅黑", 10))
lb_t.pack(side="top")
# 调用生成时间的函数
get_time()
# 显示窗口
window.mainloop()
# field_sync_l = [[x] for x in field_sync_l]
# field_sync_r = [[x] for x in field_sync_r]
# # field_sync_l = sum(field_sync_l, [])
# print(field_sync_l)
# """
六.打包exe格式
使用
Pyinstaller -F -w xxx.py命令将文件打包为不使用控制台的exe文件
打包成exe后就可以发出去,不需要编译环境就可以执行
七.ajax在页面的传输效果
总结:重复的事就交给代码吧
-END-
一、Python入门
下面这些内容是Python各个应用方向都必备的基础知识,想做爬虫、数据分析或者人工智能,都得先学会他们。任何高大上的东西,都是建立在原始的基础之上。打好基础,未来的路会走得更稳重。所有资料文末免费领取!!!
包含:
计算机基础
python基础
Python入门视频600集:
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
二、Python爬虫
爬虫作为一个热门的方向,不管是在自己兼职还是当成辅助技能提高工作效率,都是很不错的选择。
通过爬虫技术可以将相关的内容收集起来,分析删选后得到我们真正需要的信息。
这个信息收集分析整合的工作,可应用的范畴非常的广泛,无论是生活服务、出行旅行、金融投资、各类制造业的产品市场需求等等,都能够借助爬虫技术获取更精准有效的信息加以利用。
Python爬虫视频资料
三、数据分析
清华大学经管学院发布的《中国经济的数字化转型:人才与就业》报告显示,2025年,数据分析人才缺口预计将达230万。
这么大的人才缺口,数据分析俨然是一片广阔的蓝海!起薪10K真的是家常便饭。
四、数据库与ETL数仓
企业需要定期将冷数据从业务数据库中转移出来存储到一个专门存放历史数据的仓库里面,各部门可以根据自身业务特性对外提供统一的数据服务,这个仓库就是数据仓库。
传统的数据仓库集成处理架构是ETL,利用ETL平台的能力,E=从源数据库抽取数据,L=将数据清洗(不符合规则的数据)、转化(对表按照业务需求进行不同维度、不同颗粒度、不同业务规则计算进行统计),T=将加工好的表以增量、全量、不同时间加载到数据仓库。
五、机器学习
机器学习就是对计算机一部分数据进行学习,然后对另外一些数据进行预测与判断。
机器学习的核心是“使用算法解析数据,从中学习,然后对新数据做出决定或预测”。也就是说计算机利用以获取的数据得出某一模型,然后利用此模型进行预测的一种方法,这个过程跟人的学习过程有些类似,比如人获取一定的经验,可以对新问题进行预测。
机器学习资料:
六、Python高级进阶
从基础的语法内容,到非常多深入的进阶知识点,了解编程语言设计,学完这里基本就了解了python入门到进阶的所有的知识点。
到这就基本就可以达到企业的用人要求了,如果大家还不知道去去哪找面试资料和简历模板,我这里也为大家整理了一份,真的可以说是保姆及的系统学习路线了。
但学习编程并不是一蹴而就,而是需要长期的坚持和训练。整理这份学习路线,是希望和大家共同进步,我自己也能去回顾一些技术点。不管是编程新手,还是需要进阶的有一定经验的程序员,我相信都可以从中有所收获。
一蹴而就,而是需要长期的坚持和训练。整理这份学习路线,是希望和大家共同进步,我自己也能去回顾一些技术点。不管是编程新手,还是需要进阶的有一定经验的程序员,我相信都可以从中有所收获。
资料领取
这份完整版的Python全套学习资料已经上传优快云官方,朋友们如果需要可以点击下方优快云官方认证微信卡片免费领取 ↓↓↓【保证100%免费】