机缘
提示:可以和大家分享最初成为创作者的初心
例如:
- 平时利用EXCEL文件来记录工作任务安排,但每次都而要打开文件进行查看,感觉不直观与方便,便利用python 将excel文件内容读取出来进行统计显示。每次开机自动启动,看着比较方便。
- 里面的代码都是从网络上搜索到的个个片段,没有啥效率可读性,目的就是解决问题。
#使用pandas统计数据比较容易
import numpy as np
import pandas as pd
df=pd.DataFrame(pd.read_excel('工作任务统计.xlsx',sheet_name=0))
#df.shape #返回df的行数和列数 df.shape[0]#返回df的行数
print(df.shape[0])
aa=df['是否完成'].value_counts()#现在要统计是否完成出现的次数并制成一个新的DataFrame。
print(type(aa))
print(aa[0])
bb=df.groupby(by=['责任人','是否完成']).size()
print(type(bb))
print('..................................')
print(bb)
print('..................................')
cc=str(bb) #将pandas.core.series.Series格式 转换为 字符串
dd=cc.split() #按空格对字符串进行格式化,
print(dd[2]+"未完成任务:"+dd[4]+"完成任务数:"+dd[6])
import textwrap
import time, threading
import tkinter as tk
import ttkbootstrap as ttk
from random import choice
from ttkbootstrap.constants import *
import openpyxl
from tkinter import messagebox # 弹出提示框
from tkinter.scrolledtext import ScrolledText
def datastatistics(): # excel文件数据统计分析
wb = openpyxl.load_workbook(r'D:\工作文件\2023年\2023年工作任务清单.xlsx')
sheets = wb.sheetnames
未完成任务 = []
已完成任务 = []
未完成任务计数 = 0
未完成任务分类计数 = []
已完成任务计数 = 0
已完成任务分类计数 = []
global 未完成人员计数
global 每个人完成任务计数
global 每个人未完成任务计数
未完成人员计数=[]
for i in range(len(sheets)):
sheet = wb.get_sheet_by_name(sheets[i])
# print('\n\n第' + str(i + 1) + '个sheet: ' + sheet.title + '->>>')
for r in range(1, sheet.max_row + 1):
if sheet.cell(row=r, column=10).value == "否":
未完成任务计数 = 未完成任务计数 + 1
未完成人员计数.append(sheet.title)
未完成人员计数.append((sheet.cell(row=r, column=3).value))
未完成任务分类计数.append(sheet.title)
未完成任务.append(sheet.cell(row=r, column=3).value)
if sheet.cell(row=r, column=10).value == "是":
已完成任务计数 = 已完成任务计数 + 1
已完成任务分类计数.append(sheet.title)
已完成任务.append(sheet.cell(row=r, column=3).value)
总任务数 = 未完成任务计数 + 已完成任务计数
每个人完成任务计数 = {}
每个人未完成任务计数 = {}
for i in range(len(sheets)):
sheet = wb.get_sheet_by_name(sheets[i])
每个人完成任务计数.update({sheets[i]: 已完成任务分类计数.count(sheets[i])})
每个人未完成任务计数.update({sheets[i]: 未完成任务分类计数.count(sheets[i])})
for x, y in 每个人完成任务计数.items(): # 通过使用 items() 函数遍历键和值:
print(x, y)
for x, y in 每个人未完成任务计数.items(): # 通过使用 items() 函数遍历键和值:
print(x, y)
return 总任务数, 已完成任务计数, 未完成任务计数, 未完成任务, 已完成任务
def create_labelframe_style(bootstyle, style):
global 函数返回数据
函数返回数据 = datastatistics()
frame = ttk.Frame(root, padding=5)
# title
title = ttk.Label(frame, text='Labelframe', anchor=tk.CENTER)
title.pack(padx=5, pady=2, fill=tk.BOTH)
ttk.Separator(frame,bootstyle="danger").pack(padx=5, pady=5, fill=tk.X) #彩色分割线
# default
lbl = ttk.Labelframe(
master=frame,
text='工作任务信息统计',
bootstyle='primary',
width=150,
height=75
)
lbl.pack(padx=5, pady=5, fill=tk.BOTH)
ttk.Label(lbl, text="总任务数:").grid(row=1, column=0)
ttk.Label(lbl, text=函数返回数据[0], bootstyle='success').grid(row=1, column=1)
ttk.Label(lbl, text="未完成:").grid(row=1, column=2)
ttk.Label(lbl, text=函数返回数据[2], bootstyle='success').grid(row=1, column=3)
ttk.Label(lbl, text="已完成:").grid(row=1, column=4)
ttk.Label(lbl, text=函数返回数据[1], bootstyle='success').grid(row=1, column=5)
frame1 = ttk.Frame(root, padding=5)
lbl2 = ttk.Labelframe(master=frame, text='未完成工作任务', bootstyle='primary', width=5, height=500)
lbl2.pack_propagate(0)
lbl2.pack(padx=5, pady=5, fill=tk.BOTH)
scrolledText = ScrolledText(root, width=2, height=220)
scrolledText = ttk.ScrolledText(lbl2)
scrolledText.pack(padx=5, pady=5)
cb_var = []
global is_check_list
global aaff
is_check_list = []
def truncate_string(text, max_length=15): #这是一个超过20个字符的示例文本,我们将对其进行截断处理。
if len(text) > max_length:
return text[:max_length] + '...'
else:
return text.ljust(max_length, '.')
for i in range(len(函数返回数据[3])):
truncated_text = truncate_string(str(函数返回数据[3][i]))
is_check_list.append(ttk.IntVar(value=0))
bb = 未完成人员计数.index(str(函数返回数据[3][i]))
cc=(未完成人员计数[bb - 1])
cb = ttk.Checkbutton(scrolledText, text=wrap(truncated_text), variable=is_check_list[-1],bootstyle='success-toolbutton')
scrolledText.window_create('end', window=cb)
scrolledText.insert('end', '\n')
cb.bind('<ButtonRelease>', aa) # 列表框绑定鼠标事件函数
return frame
def aa(self): # 读取列表框所选择的内容
all_select = ""
for i in range(0, len(is_check_list)):
if is_check_list[i].get() == 1:
all_select += 函数返回数据[3][i] + " "
aa=函数返回数据[3][i]
if all_select == "": # 如果没读取到内容就重新取一次,否则就显示已读取成功数据
for i in range(0, len(is_check_list)):
if is_check_list[i].get() == 1:
all_select += 函数返回数据[3][i] + " "
aa = 函数返回数据[3][i]
else:
bb=未完成人员计数.index(aa)
bbb=未完成人员计数[bb-1]
messagebox.showinfo("提示", "你所选择的数据是:" + all_select+" [承办人:"+str(bbb)+"]")
def wrap(string, lenght=18): # 换行显示
return '\n'.join(textwrap.wrap(string, lenght))
def change_style():
theme = choice(style.theme_names())
style.theme_use(theme)
def set_window_opacity(window, opacity):
"""
设置Tkinter窗口的透明度。
参数:
window: Tk() 对象或 Toplevel 对象
opacity: 0.0 (完全透明) 到 1.0 (完全不透明) 之间的浮点数
"""
try:
# 对于Windows系统
window.attributes('-alpha', opacity)
except tk.TclError:
pass
if __name__ == '__main__':
# create visual widget style tests
# root = ttk.Window(size=(800,600))
root = tk.Tk()
#root = ttk.Window(themename="solar") #主题
root.resizable(False, False) # 窗口不可调整大小。
root.geometry("+1200+100") #窗口位置
#set_window_opacity(root, 0.5) # 设置50%的透明度
style = ttk.Style()
ttk.Button(text="Change Theme", command=change_style).grid(row=0, column=0)
create_labelframe_style('', style).grid(row=0, column=0)
root.mainloop()