前言
书承上文,之前做的计算器,仅仅是在调用excel里的数据,生成图表并放回到excel表里,每次要查看图片还要打开excel文件查看,实属繁琐,这几天学习了tkinter的相关知识,弃用之前简单使用的esaygui,先做一个简单的可视化的计算器,美化后面再慢慢实现
目标
运行py文件,让用户选择季节,输入当前的天数,然后就可以直接查看相应的图,一目了然
excel表格
和上次比没有改动,调用excel部分的代码也无修改
代码
import xlwings as xw
import matplotlib.pyplot as plt
import pandas as pd
from tkinter import *
from tkinter import messagebox
from tkinter.ttk import * #界面美化
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
app = xw.App(visible=False, add_book=False)
file_path = 'd:\\python_study\\xinglugu.xlsx' # 定义文件路径
workbook = app.books.open(file_path)
wsh1 = workbook.sheets['spring'] # 定义需要用的工作表
wsh2 = workbook.sheets['summer']
wsh3 = workbook.sheets['autumn']
def add_labels(rects): #定义柱形图上数值显示的函数
for rect in rects: #用for语句遍历每个柱状图
height = rect.get_height() #获取柱状图的高度
if height >= 0: #判断柱状图高度是否大于0,以确定数据标签的位置
plt.text(rect.get_x() + rect.get_width() / 2, height + 0.02 , '%.2f' % height, ha='center',
va='bottom', color='black')
else:
plt.text(rect.get_x() + rect.get_width() / 2, height - 1.3 , '%.2f' % height, ha='center',
va='bottom', color='black')
rect.set_edgecolor('black') #设置柱状图柱形条边框颜色
def print_picture(): #定义画图的动作,用于“计算”按钮
num = var.get() #获取选项按钮返回的var变量值,1代表“春季”,2代表“夏季”,3代表“秋季”
day = int(day_entry.get()) #获取输入框输入的值,并转换为int类型
if day > 28:
messagebox.showinfo(title='提示', message='请输入1-28以内的整数')
if day <= 28:
if num == 1:
i = 2 # 公式需要循环获得每个单元格的值,定义各个变量,注意此处用f-string方式格式化变量,否则会报错
while wsh1.range(f"B{i}").value is not None: # 此处意指判定B列值为空时停止循环,注意判定为空值用None
Bi = wsh1.range(f"B{i}").value # 定义变量
Ci = wsh1.range(f"C{i}").value
Fi = wsh1.range(f"F{i}").value
Gi = wsh1.range(f"G{i}").value
Hi = wsh1.range(f"H{i}").value
if day + int(Gi) > 28: # 用if语句判定如果目前天数加上作物生长需要天数大于28,则收益为0
wsh1.range(f"L{i}").value = "0"
else:
if Hi == None: # 用if语句判定是否为可持续收获作物
a = (Ci * Fi - Bi) / Gi
else:
a = (int(((28 - day) - Gi)