from tkinter import * # 导入tkinter库
import pandas as pd
import numpy as np
# 1、读取话单并显示
def read():
global dc
dc = pd.read_csv("hd.dat", sep=' ', header=0, encoding='utf-8', dtype=
{'主叫区号': np.string_, '主叫电话号码': np.string_, '被叫区号': np.string_, '被叫电话号码': np.string_, '通话时长(秒)': np.int32})
text.delete(0.0, 'end')
text.insert('end', dc)
# 根据通话时间计算本地话费
def com_local(seconds):
if seconds <= 180:
return 0.5
elif seconds % 180 == 0: # 三分钟整数倍
return (seconds // 180 - 1) * 0.2 + 0.5
else:
return (seconds // 180) * 0.2 + 0.5 # (seconds//180+1)-1
# 根据通话时间和区号计算长途话费
def com_long(seconds, feilv):
if seconds % 60 == 0:
return (seconds // 60) * feilv
else:
return (seconds // 60 + 1) * feilv
# 2、计算话费并显示
def comp_fy():
global fy
fl = pd.read_csv("fl.dat", sep=' ', header=0, dtype={'区号': np.string_, '费率': np.float64}) # 读取费率文件
dict1 = dict(zip(fl['区号'], fl['费率'])) # zip接受序列作为参数,返回turple列表;实现了将费率第一列变成字典的键,第二列为对应的值
dc['通话类型'] = '' # 新增一列
dc['本地通话费用'] = '' # 新增一列
dc['长途通话费用'] = '' # 新增一列
dc['通话费用'] = '' # 新增一列
for i in range(dc.shape[0]):
if dc['被叫区号'][i] == '025':
dc.loc[i, '通话类型'] = '本地通话'
dc.loc[i, '本地通话费用'] = com_local(dc['通话时长(秒)'][i])
dc.loc[i, '长途通话费用'] = 0.0
else:
dc.loc[i, '通话类型'] = '长途通话'
dc.loc[i, '本地通话费用'] = 0.0
dc.loc[i, '长途通话费用'] = com_long(dc['通话时长(秒)'][i], dict1[dc['被叫区号'][i]])
dc.loc[i, '通话费用'] = dc['本地通话费用'][i] + dc['长途通话费用'][i]
fy = dc.loc[:, ['主叫电话号码', '通话类型', '通话费用']]
text.delete(0.0, 'end')
text.insert('end', fy)
# 3、话费信息保存到文件
def fy_to_csv():
fy.to_csv('fy.dat', sep=' ', mode='w+', index=0)
text.delete(0.0, 'end')
text.insert('end', "话费信息成功写入到文件!\n文件名:fy.dat")
# 根据电话号码搜索用户名
def sear_name(number):
yh = pd.read_csv("yh.dat", sep=' ', header=0, dtype={'电话号码': np.string_, '用户姓名': np.string_}) # 读取用户文件
dict2 = dict(zip(yh['电话号码'], yh['用户姓名']))
return dict2[number]
# 4.根据主叫号码查询话费
def sear_fy():
number = text.get(0.0, 'end')[0:-1]
fy_sort = fy[fy['主叫电话号码'] == number]
if fy_sort.empty:
text.delete(0.0, 'end')
text.insert('end', "您输入的号码不存在!")
else:
fy_sort1 = fy_sort[fy_sort['通话类型'] == '本地通话']
fy_sort2 = fy_sort[fy_sort['通话类型'] == '长途通话']
bendi = fy_sort1['通话费用'].sum()
changtu = fy_sort2['通话费用'].sum()
zongji = bendi + changtu
bendi = str('%.1f' % bendi)
changtu = str('%.1f' % changtu)
zongji = str('%.1f' % zongji)
text.delete(0.0, 'end')
text.insert('end', "您查询的号码的话费如下:\n")
text.insert('end', "用户名 电话号码 本地话费 长途话费 话费总计\n")
text.insert('end',
sear_name(number) + " " + number + " " + bendi + " " + changtu + " " + zongji)
# 5、根据主叫号码查询话单
def sear_hd():
number = text.get(0.0, 'end')[0:-1]
dc_sort = dc[dc['主叫电话号码'] == number]
if dc_sort.empty:
text.delete(0.0, 'end')
text.insert('end', "您输入的号码不存在!")
else:
dc_sort.insert(dc_sort.shape[1], '用户名', sear_name(number))
hd = dc_sort.loc[:, ['用户名', '主叫电话号码', '被叫电话号码', '通话时长(秒)']]
text.delete(0.0, 'end')
text.insert('end', "您查询的号码的话单如下:\n")
text.insert('end', hd)
win = Tk() # 创建窗口
win.title('学生成绩核算系统') # 设置标题
win.geometry('900x850')
label = Label(win, text="欢迎使用电信计费系统", font=('Arial', 20), width=100, height=2)
btn1 = Button(win, text='1、读取话单并显示 ', command=read)
btn2 = Button(win, text='2、计算话费并显示 ', command=comp_fy)
btn3 = Button(win, text='3、话费信息保存到文件 ', command=fy_to_csv)
btn4 = Button(win, text='4、下方输入号码查询话费', command=sear_fy)
btn5 = Button(win, text='5、下方输入号码查询话单', command=sear_hd)
btn6 = Button(win, text='6、退出系统 ', command=win.quit)
text = Text(win)
label.pack()
btn1.pack()
btn2.pack()
btn3.pack()
btn4.pack()
btn5.pack()
btn6.pack()
text.pack()
win.mainloop() # 进入消息循环
评论10