缺陷得分计算器
- python实现一个缺陷得分计算器
python实现一个缺陷得分计算器
from tkinter import LabelFrame, Button, Text, Frame, END, IntVar, Tk, Radiobutton, Label, font as tkFont
from time import strftime, localtime, time
class MY_GUI():
def __init__(self,init_window_name):
self.init_window_name = init_window_name
self.bugLevelList=[("致命",1.0),("严重", 0.7),("一般",0.4),("轻微",0.2)] #第2个参数,得分比例
self.bugProbabilityList = [("80%以上",1.0), ("50%~80%",0.7), ("20%~50%",0.4),("20%以下",0.2)] #第2个参数,得分比例
self.bugTypeList = [("功能测试",1.0), ("性能测试",0.8), ("可靠性测试",0.4), ("兼容性测试",0.2)] #第2个参数,得分比例
#权重定义
self.Weight={'bugLevel': 0.6, 'bugProbability': 0.3, 'bugType': 0.1}
#当前日志行数
self.LOG_LINE_NUM = 0
#设置窗口
def set_init_window(self):
##@初始化窗口
self.init_window_name.title("Hik缺陷定级工具_v0.1") #窗口名
self.init_window_name.geometry('610x510')
self.init_window_name.iconbitmap('.\\bitbug_favicon.ico')
#self.init_window_name["bg"] = "pink" #窗口背景色
#self.init_window_name.attributes("-alpha",0.9) #虚化,值越小虚化程度越高
##@创建3个frame区域和1个计算按钮,并进行布局,3个frame区域分别是: 缺陷参数设置区域、日志区域、计算结果区域
# 定义frame title的字体
frameFont = tkFont.Font(family='微软雅黑', size=12)
# 创建缺陷参数设置区域,长在主window窗口上
inputframe = LabelFrame(self.init_window_name, text="缺陷参数", font=frameFont, borderwidth=2, width=320, height=330, relief="ridge", background="#F2F2F2")
inputframe.grid(row=0, column=0, sticky='NW', padx=10, pady=10)
inputframe.grid_propagate(0)
inputframe.pack_propagate(0)
# 创建日志区域,长在主window窗口上
logframe = LabelFrame(self.init_window_name, text="LOG日志", font=frameFont, borderwidth=2, relief="ridge", width=320, height=146, background="#F2F2F2")
logframe.grid(row=1, column=0, sticky='NW', padx=10, pady=0)
logframe.grid_propagate(0)
logframe.pack_propagate(0)
# 创建计算按钮,长在主window窗口上
btn = Button(self.init_window_name, text="计算", width=4, height=2, borderwidth=3, relief="raised", bg="#BDBDBD", font=('宋体', 12, 'bold'), command=self.calcBugScore)
btn.grid(row=0, column=1, sticky='NW', pady=60)
# 创建结果展示区域,长在主window窗口上
resultframe = LabelFrame(master=self.init_window_name, text="得分结果", font=frameFont, borderwidth=2, relief="ridge", padx=10, pady=10, width=200, height=496, background="#F2F2F2")
resultframe.grid(row=0, column=2, rowspan=2, padx=10, pady=10)
resultframe.grid_propagate(0)
resultframe.pack_propagate(0)
##@定义缺陷参数选择区域的字体,在缺陷参数选择区域,放置各类选择按钮
bugLevelFont = tkFont.Font(family='微软雅黑', size=9)
# 缺陷严重程度菜单
bugLevelMenu = [(value[0], key+1) for key, value in enumerate(self.bugLevelList)]
self.selectedBugLevel = self.createBugPara(inputframe, "缺陷严重程度:", bugLevelMenu, bugLevelFont, gridRow=0, gridColumn=0)
# 缺陷发生概率
bugProbabilityMenu = [(value[0], key + 1) for key, value in enumerate(self.bugProbabilityList)]
self.selectedBugProbability = self.createBugPara(inputframe, "缺陷发生概率:", bugProbabilityMenu, bugLevelFont, gridRow=2, gridColumn=0)
# 缺陷类型
bugTypeMenu = [(value[0], key + 1) for key, value in enumerate(self.bugTypeList)]
self.selectedBugType = self.createBugPara(inputframe, "缺陷类型:", bugTypeMenu, bugLevelFont, gridRow=0, gridColumn=1)
##@定义结果区域的文本框
# 设置总得分字体样式
totalScoreFont = tkFont.Font(family='微软雅黑', size=15, weight='bold')
self.result_data_Text = Text(resultframe, font=bugLevelFont, width=38, height=49, background="#F2F2F2", border='0') # 处理结果展示
self.result_data_Text.pack()
self.result_data_Text.tag_config('tag1', spacing1=5, foreground="green", font=bugLevelFont)
self.result_data_Text.tag_config('tag2', spacing1=5, font=totalScoreFont)
# self.result_data_Text.grid(padx=1, pady=1, rowspan=15, columnspan=10)
##@定义日志区域的文本框
self.log_data_Text = Text(logframe, font=bugLevelFont, width=80, height=10, padx=20, background="#F2F2F2", border='0') # 日志区域展示
self.log_data_Text.pack()
self.log_data_Text.tag_config('tag1', foreground="red")
self.log_data_Text.tag_config('tag2', font=bugLevelFont)
# self.log_data_Text.grid(row=13, column=0, columnspan=13)
def createBugPara(self, frameArea, menuTitle, menu, font, gridRow, gridColumn):
'''用于创建缺陷参数单选控件:首先创建一个子frame区域,放置在主frame上,然后在子frame区域上,放置缺陷参数radiobutton控件'''
##@创建子区域:
frame = Frame(frameArea, borderwidth='0', width=120, height=150, relief="ridge", background="#F2F2F2")
frame.grid(row=gridRow, column=gridColumn, rowspan=2, padx=10)
frame.grid_propagate(0)
frame.pack_propagate(0)
##@创建标题
# Label(frame, text='', font=font).pack(anchor='sw', padx=1, pady=1)
Label(frame, text=menuTitle, font=font ).pack(anchor='sw', padx=1)
##@创建缺陷严重程度单选框:
selectValue = IntVar()
for text, value in menu:
b = Radiobutton(frame, text=text, variable=selectValue, value=value)
b.pack(anchor='w', padx=15)
return selectValue
#功能函数
def calcBugScore(self):
# 清空结果区域
self.result_data_Text.delete('1.0',END)
bugLevelValue = self.selectedBugLevel.get()
bugProbabilityValue = self.selectedBugProbability.get()
bugTypeValue = self.selectedBugType.get()
if bugLevelValue and bugProbabilityValue and bugTypeValue:
# 计算得分:计算方法为总分*指标权重*选项权重。分别计算出每个指标的得分
bugLevelScore = 100 * self.Weight['bugLevel'] * self.bugLevelList[bugLevelValue-1][1]
bugProbabilityScore = 100 * self.Weight['bugProbability'] * self.bugProbabilityList[bugProbabilityValue - 1][1]
bugTypeScore = 100 * self.Weight['bugType'] * self.bugTypeList[bugTypeValue - 1][1]
totalScore = bugLevelScore + bugProbabilityScore + bugTypeScore
# 将分数结果,绘制在结果区域的文本框中
self.result_data_Text.insert(END, "缺陷严重程度的得分是:%s分\n" % bugLevelScore , 'tag1')
self.result_data_Text.insert(END, "缺陷发生概率的得分是:%s分\n" % bugProbabilityScore, 'tag1')
self.result_data_Text.insert(END, "缺陷类型的得分是:%s分\n" % bugTypeScore, 'tag1')
self.result_data_Text.insert(END, "\n总得分是:%s分\n" % totalScore, 'tag2')
# 将计算成功的消息发送到日志区域
self.write_log_to_Text("计算成功,总得分是:%s分" % totalScore, 'tag2')
elif not bugLevelValue:
self.write_log_to_Text("请选择缺陷严重程度!", 'tag1')
elif not bugProbabilityValue:
self.write_log_to_Text("请选择缺陷发生概率!", 'tag1')
else:
self.write_log_to_Text("请选择缺陷类型!", 'tag1')
#日志动态打印
def write_log_to_Text(self,logmsg, tag):
current_time = strftime('%Y-%m-%d %H:%M:%S',localtime(time()))
logmsg_in = str(current_time) +" " + str(logmsg) + "\n" #换行
if self.LOG_LINE_NUM <= 6:
self.log_data_Text.insert(END, logmsg_in, tag)
self.LOG_LINE_NUM += 1
else:
self.log_data_Text.delete(1.0,2.0)
self.log_data_Text.insert(END, logmsg_in,tag)
if __name__ == '__main__':
init_window = Tk() #实例化出一个父窗口
# 启动应用程序
MY_GUI(init_window).set_init_window()
init_window.mainloop() #父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示