软件代做:利⽤Python编写⼀个⾏业专⽤的⼩计算器
前⾔:本⽂讲述的是如何利⽤python编程制作⼀个适⽤于指定⾏业的计算器,⽅便计算结果,涵盖的知识点由Python编写GUI界⾯程序,利⽤爬⾍采集实时的汇率数据,将Python⽂件打包成可以单独运⾏的exe⽂件。
⾸先,分析我们的需求,编写⼀个适⽤于指定⾏业的计算器,这⾥我们⽤到的计算公式很简单,就是淘宝提供的⾦⽯定价公式,如下图所⽰
淘宝定价计算器
这⾥可以看到这个计算公式还是蛮简单的,对于Python来说也就是⼀⾏代码的事,那么我们就开始着⼿写代码,⾸先搭建我们的页⾯布局,这⾥我们采⽤的是tkinter,这个框架在画GUI⽅⾯还是很简单⽅便的,⾸先给⼤家展⽰下我的最终布局,如下图所⽰
最终样式
其实也不是很好看,不过我已经尽我所能去美化了,其实功能很简单,就是⼏个输⼊框,两个按钮,点击计算按钮,获取输⼊框中的值,通过Python代码计算结果,最后将计算结果写⼊指定的输⼊框中,关于tkinter的组件介绍,可以⾃⾏百度,我这⾥就直接上代码了
class Application(tk.Tk):
def __init__(self):
super().__init__()
def createUI(self):
self.ft = tf.Font(family='微软雅⿊', size=18,weight=tf.BOLD)
self.ft1 = tf.Font(family='微软雅⿊', size=12)
self.fm = tk.Frame(self)
self.label = tk.Label(self.fm,text="计算结果:",font=self.ft)
self.label.pack(side=tk.LEFT)
self.fm_new1 = tk.Frame(self.fm)
self.label0 = tk.Label(self.fm_new1,text="⼈民币:",font=self.ft1)
self.label0.pack(side=tk.LEFT)
<0 = tk.Entry(self.fm_new1,font=self.ft1)
<0.pack(side=tk.LEFT)
self.label11 = tk.Label(self.fm_new1,text="美元:",font=self.ft1)
self.label11.pack(side=tk.LEFT)
<11 = tk.Entry(self.fm_new1,font=self.ft1)
<11.pack(side=tk.LEFT)
self.fm_new1.pack(side=tk.TOP,padx=5, pady=10)
self.fm_new2 = tk.Frame(self.fm)
self.label12 = tk.Label(self.fm_new2,text="新加坡币:",font=self.ft1)
self.label12.pack(side=tk.LEFT)
<12 = tk.Entry(self.fm_new2,font=self.ft1)
<12.pack(side=tk.LEFT)
self.label13 = tk.Label(self.fm_new2,text="⽇元:",font=self.ft1)
self.label13.pack(side=tk.LEFT)
<13 = tk.Entry(self.fm_new2,font=self.ft1)
<13.pack(side=tk.LEFT)
self.fm_new2.pack(side=tk.TOP,padx=5, pady=10)
self.fm.pack(side=tk.TOP,padx=5, pady=10)
self.fm1 = tk.Frame(self)
self.label1 = tk.Label(self.fm1,text="⾦重:",font=self.ft1)
self.label1.pack(side=tk.LEFT,padx=10, pady=10)
<1 = tk.Entry(self.fm1,font=self.ft1)
<1.pack(side=tk.LEFT,padx=5, pady=10)
self.label10 = tk.Label(self.fm1,text="浮动⽐率:",font=self.ft1)
self.label10.pack(side=tk.LEFT,padx=10, pady=10)
<10 = tk.Entry(self.fm1,font=self.ft1)
<10.pack(side=tk.LEFT,anchor=tk.W,padx=5, pady=10)
self.fm1.pack(side=tk.TOP,padx=5, pady=5)
self.fm2 = tk.Frame(self)
self.label2 = tk.Label(self.fm2,text="⾦价:",font=self.ft1)
self.label2.pack(side=tk.LEFT,padx=10, pady=10)
<2 = tk.Entry(self.fm2,font=self.ft1)
<2.pack(side=tk.LEFT,padx=5, pady=10)
self.labe3 = tk.Label(self.fm2,text="14K/18K:",font=self.ft1)
self.labe3.pack(side=tk.LEFT,padx=10, pady=10)
<3 = tk.Entry(self.fm2,font=self.ft1)
<3.pack(side=tk.LEFT,padx=5, pady=10)
self.fm2.pack(side=tk.TOP,padx=5, pady=5)
self.fm3 = tk.Frame(self)
self.label4 = tk.Label(self.fm3,text="主⽯重:",font=self.ft1)
self.label4.pack(side=tk.LEFT,padx=10, pady=10)
<4 = tk.Entry(self.fm3,font=self.ft1)
<4.pack(side=tk.LEFT,padx=5, pady=10)
self.label5 = tk.Label(self.fm3,text="价格:",font=self.ft1)
self.label5.pack(side=tk.LEFT,padx=10, pady=10)
<5 = tk.Entry(self.fm3,font=self.ft1)
<5.pack(side=tk.LEFT,padx=5, pady=10)
self.fm3.pack(side=tk.TOP,padx=5, pady=5)
self.fm4 = tk.Frame(self)
self.label6 = tk.Label(self.fm4,text="副⽯重:",font=self.ft1)
self.label6.pack(side=tk.LEFT,padx=10, pady=10)
<6 = tk.Entry(self.fm4,font=self.ft1)
<6.pack(side=tk.LEFT,padx=5, pady=10)
self.labe7 = tk.Label(self.fm4,text="价格:",font=self.ft1)
self.labe7.pack(side=tk.LEFT,padx=10, pady=10)
<7 = tk.Entry(self.fm4,font=self.ft1)
<7.pack(side=tk.LEFT,padx=5, pady=10)
self.fm4.pack(side=tk.TOP,padx=5, pady=5)
self.fm5 = tk.Frame(self)
self.label8 = tk.Label(self.fm5,text="⼯费:",font=self.ft1)
self.label8.pack(side=tk.LEFT,padx=10, pady=10)
<8 = tk.Entry(self.fm5,font=self.ft1)
<8.pack(side=tk.LEFT,padx=5, pady=10)
self.labe9 = tk.Label(self.fm5,text="设计费:",font=self.ft1)
self.labe9.pack(side=tk.LEFT,padx=5, pady=10)
<9 = tk.Entry(self.fm5,font=self.ft1)
<9.pack(side=tk.LEFT,padx=10, pady=10)
self.fm5.pack(side=tk.TOP,padx=5, pady=5)
self.fm6 = tk.Frame(self)
self.selectButton = tk.Button(self.fm6, text="重置", command=self.selectFile,font=self.ft1)
self.selectButton.pack(side=tk.LEFT,padx=10, pady=10)
self.startButton = tk.Button(self.fm6, text="计算", command=lambda :self.thread_it(self.startAction),font=self.ft1)
self.startButton.pack(side=tk.LEFT,padx=10, pady=10)
self.fm6.pack(side=tk.TOP,padx=5, pady=5)
self.title("我的计算器")
#窗⼝⼤⼩
width ,height= 600, 500
#窗⼝居中显⽰
#窗⼝最⼤值
self.maxsize(600, 500)
#窗⼝最⼩值
self.minsize(300,200)
<0.insert('end',0)
<1.insert('end',0)
<2.insert('end',0)
<3.insert('end',0)
<4.insert('end',0)
<5.insert('end',0)
<6.insert('end',0)
<7.insert('end',0)
<8.insert('end',150)
<9.insert('end',50)
<10.insert('end',1.25)
<11.insert('end',0)
<12.insert('end',0)
<13.insert('end',0)
说实话这段代码写的很随意,变量命名很随意,因为很多都是重复的东西,这⾥⼤致讲⼀下,⾸先是创建定义⼀个类继承⾃tkinter,这就相当于整个对象就是⼀个窗体了,之后就在这个窗体中进⾏布局,这⾥我们采⽤的是pack布局,说⽩了就是浮动布局,就是按照⼀⾏或者⼀列依次排列组件,这⾥就是利⽤Frame组件⽣成了⼏⾏的布局,然后在每个Frame⾥排列我们的标签和输⼊框,其中包含的⼀些细节就是组件的字体,组件之间的间距之类,完成了布局这⼀步之后,我们需要给按钮绑定事件,就是点击按钮触发什么操作,这⾥我们有两个按钮。
其中重置按钮是为了清除输⼊的错误数据,绑定的事件就⽤command=self.selectFile这⾏代码来指定,这样就可以绑定到selectFile这个函数上,这个函数的代码如下所⽰
def selectFile(self):
<1.delete(0, "end")
<4.delete(0, "end")
<6.delete(0, "end")
<1.insert('end',0)
<4.insert('end',0)
<6.insert('end',0)
然后计算按钮是为了执⾏计算操作,这⾥我们采⽤了线程的⽅式进⾏绑定,也就是异步执⾏,不会卡住,避免因计算量过⼤导致程序假死的现象,绑定的⽅式是command=lambda :self.thread_it(self.startAction)
绑定的函数如下所⽰
def startAction(self):
A = ()
print(A)
B = ()
print(B)
C = ()
print(C)
D = ()
print(D)
E = ()
print(E)
F = ()
print(F)
G = ()
print(G)
H = ()
print(H)
I = ()
print(I)
J = ()
print(J)
result = ((float(A)*float(B)*float(C))+(float(D)*float(E))+(float(F)*float(G))+(float(H)+float(I)))*float(J)
USDCNY,SGDCNY,JPYCNY = Rate()
USDCNY_result = result/USDCNY
SGDCNY_result = result/SGDCNY
JPYCNY_result = USDCNY_result*JPYCNY
<0.delete(0, "end")
<0.insert('end',str(round(result, 2)))
<11.delete(0, "end")
python新手适合的软件
<11.insert('end',str(round(USDCNY_result, 2)))
<12.delete(0, "end")
<12.insert('end',str(round(SGDCNY_result, 2)))
<13.delete(0, "end")
<13.insert('end',str(round(JPYCNY_result, 2)))
@staticmethod
def thread_it(func, *args):
t = threading.Thread(target=func, args=args)
t.setDaemon(True)
t.start()
⾄此基本完成了,不过完成的软件是这样的,如下所⽰
初始版本
可以看到⽐较明显的差异在计算结果那块,因为后⾯和客户沟通了,他需要其他币种的计算结果,所以后⾯就增加了⼏种结果,这⾥就⽤到了爬⾍技术去采集实时的汇率,这⾥直接奉上了代码,直接解析的接⼝数据,所以很简单
def getRate(self):
url = "webforex.hermes.hexun/forex/quotelist?code=FOREXUSDCNY,FOREXSGDCNY,FOREXUSDJPY&column=Code,Price"
req = quest.Request(url)
f = quest.urlopen(req)
html = f.read().decode("utf-8")
print(html)
s = re.findall("{.*}",str(html))[0]
sjson = json.loads(s)
USDCNY = sjson["Data"][0][0][1]/10000
print(USDCNY)
SGDCNY = sjson["Data"][0][1][1]/10000
print(SGDCNY)
JPYCNY = sjson["Data"][0][2][1]/10000
print(JPYCNY)
return USDCNY,SGDCNY,JPYCNY
⾄此,Python代码基本完成了,这⾥奉上完整的代码
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
import threading
import tkinter.font as tf
import re
import json
quest
class Application(tk.Tk):
def __init__(self):
super().__init__()
def createUI(self):
self.ft = tf.Font(family='微软雅⿊', size=18,weight=tf.BOLD)
self.ft1 = tf.Font(family='微软雅⿊', size=12)
self.fm = tk.Frame(self)
self.label = tk.Label(self.fm,text="计算结果:",font=self.ft)
self.label.pack(side=tk.LEFT)
self.fm_new1 = tk.Frame(self.fm)
self.label0 = tk.Label(self.fm_new1,text="⼈民币:",font=self.ft1)
self.label0.pack(side=tk.LEFT)
<0 = tk.Entry(self.fm_new1,font=self.ft1)
<0.pack(side=tk.LEFT)
self.label11 = tk.Label(self.fm_new1,text="美元:",font=self.ft1)
self.label11.pack(side=tk.LEFT)
<11 = tk.Entry(self.fm_new1,font=self.ft1)
<11.pack(side=tk.LEFT)
self.fm_new1.pack(side=tk.TOP,padx=5, pady=10)
self.fm_new2 = tk.Frame(self.fm)
self.label12 = tk.Label(self.fm_new2,text="新加坡币:",font=self.ft1)        self.label12.pack(side=tk.LEFT)
<12 = tk.Entry(self.fm_new2,font=self.ft1)
<12.pack(side=tk.LEFT)
self.label13 = tk.Label(self.fm_new2,text="⽇元:",font=self.ft1)
self.label13.pack(side=tk.LEFT)
<13 = tk.Entry(self.fm_new2,font=self.ft1)
<13.pack(side=tk.LEFT)
self.fm_new2.pack(side=tk.TOP,padx=5, pady=10)
self.fm.pack(side=tk.TOP,padx=5, pady=10)
self.fm1 = tk.Frame(self)
self.label1 = tk.Label(self.fm1,text="⾦重:",font=self.ft1)
self.label1.pack(side=tk.LEFT,padx=10, pady=10)
<1 = tk.Entry(self.fm1,font=self.ft1)
<1.pack(side=tk.LEFT,padx=5, pady=10)
self.label10 = tk.Label(self.fm1,text="浮动⽐率:",font=self.ft1)
self.label10.pack(side=tk.LEFT,padx=10, pady=10)
<10 = tk.Entry(self.fm1,font=self.ft1)
<10.pack(side=tk.LEFT,anchor=tk.W,padx=5, pady=10)        self.fm1.pack(side=tk.TOP,padx=5, pady=5)
self.fm2 = tk.Frame(self)
self.label2 = tk.Label(self.fm2,text="⾦价:",font=self.ft1)
self.label2.pack(side=tk.LEFT,padx=10, pady=10)
<2 = tk.Entry(self.fm2,font=self.ft1)
<2.pack(side=tk.LEFT,padx=5, pady=10)
self.labe3 = tk.Label(self.fm2,text="14K/18K:",font=self.ft1)
self.labe3.pack(side=tk.LEFT,padx=10, pady=10)
<3 = tk.Entry(self.fm2,font=self.ft1)
<3.pack(side=tk.LEFT,padx=5, pady=10)
self.fm2.pack(side=tk.TOP,padx=5, pady=5)
self.fm3 = tk.Frame(self)
self.label4 = tk.Label(self.fm3,text="主⽯重:",font=self.ft1)
self.label4.pack(side=tk.LEFT,padx=10, pady=10)
<4 = tk.Entry(self.fm3,font=self.ft1)
<4.pack(side=tk.LEFT,padx=5, pady=10)
self.label5 = tk.Label(self.fm3,text="价格:",font=self.ft1)
self.label5.pack(side=tk.LEFT,padx=10, pady=10)
<5 = tk.Entry(self.fm3,font=self.ft1)
<5.pack(side=tk.LEFT,padx=5, pady=10)
self.fm3.pack(side=tk.TOP,padx=5, pady=5)
self.fm4 = tk.Frame(self)
self.label6 = tk.Label(self.fm4,text="副⽯重:",font=self.ft1)
self.label6.pack(side=tk.LEFT,padx=10, pady=10)
<6 = tk.Entry(self.fm4,font=self.ft1)
<6.pack(side=tk.LEFT,padx=5, pady=10)
self.labe7 = tk.Label(self.fm4,text="价格:",font=self.ft1)
self.labe7.pack(side=tk.LEFT,padx=10, pady=10)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。