首页 > 编程语言 >Python制作排班小工具【二】

Python制作排班小工具【二】

时间:2023-12-01 14:03:05浏览次数:35  
标签:group Python text self ttk num 排班 制作

一、背景

在上一篇文章中(Python制作排班小工具【一】),已经编写了小工具的排班逻辑,本篇文章将实现小工具的GUI界面。

那么先粗略画一张UI示意图,GUI界面代码就按照这张图来编写:

Python制作排班小工具【二】_Python

二、代码实现

使用ttkbootstrap:

1.创建“生成排班”和“查看记录”两个Notebook

2.将Label标签,Entry输入框,Button按钮、Checkbutton复选按钮添加到Notebook中

3.因“参与排班人员姓名”文本内容可能比较长,故使用Text文本框

4.“生成的排班表”以及“查看记录”Notebook均使用Text来展示文本内容

5.在底部添加了当前时间的展示Label,能够实时更新

6.Notebook、“查看记录”的展示Text文本框以及当前时间Label使用pack布局方式,其余均使用grid布局方式

import datetime
import time
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from tkinter import DISABLED


class GUI:

    def __init__(self, master):
        """排排班GUI"""
        self.root = master
        self.name = ttk.StringVar()  # 生成StringVar对象,以保存输入框中的内容--参与排班人员姓名
        self.each_group_num = ttk.StringVar()  # 每日值班人数
        self.group_num = ttk.StringVar()  # 值班组数量
        self.variable = ttk.BooleanVar()  # 删除人员配置开关设置--布尔值
        self.create_page()
        self.update_time()

    def create_page(self):
        """创建页面元素"""

        # # ------------------------------------标签页控件------------------------------------#
        # 创建标签页控件
        tabcontrol = ttk.Notebook(self.root)
        # 【生成排班】标签
        tab1 = ttk.Frame(tabcontrol)
        tabcontrol.add(tab1, text='生成排班')
        # 【查看记录】标签
        tab2 = ttk.Frame(tabcontrol)
        tabcontrol.add(tab2, text="查看记录")
        # 打包标签控件
        tabcontrol.pack(expand=1, fill=BOTH)
        # # ------------------------------------标签页控件------------------------------------#

        # # ------------------------------------生成排班------------------------------------#
        # 参与排班人员姓名标签
        name_label = ttk.Label(tab1, text="参与排班人员姓名:", bootstyle=PRIMARY)
        name_label.grid(row=0, column=0, pady=5)  # 使用grid布局(网格布局方式)
        # 参与排班人员姓名文本框
        self.name_input = ttk.Text(tab1, width=23, height=2, wrap=ttk.WORD)
        self.name_input.grid(row=0, column=1, columnspan=3, pady=5)

        # 每日值班人数标签
        each_group_num_label = ttk.Label(tab1, text="每日值班人数:", bootstyle=PRIMARY)
        each_group_num_label.grid(row=1, column=0, pady=5, sticky=E)
        # 每日值班人数输入框
        each_group_num_input = ttk.Entry(tab1, textvariable=self.each_group_num, width=5)
        each_group_num_input.grid(row=1, column=1, pady=5)

        # 值班组数量标签
        group_num_label = ttk.Label(tab1, text="值班组数量:", bootstyle=PRIMARY)
        group_num_label.grid(row=1, column=2, pady=5, padx=5, sticky=E)
        # 值班组数量输入框
        group_num_input = ttk.Entry(tab1, textvariable=self.group_num, width=5)
        group_num_input.grid(row=1, column=3, pady=5)

        # 生成排班按钮
        generate_button = ttk.Button(tab1, text="生成排班", bootstyle=OUTLINE, command=self.generate)
        generate_button.grid(row=2, column=0, pady=5)
        # 删除人员配置开关设置按钮
        switch_button = ttk.Checkbutton(tab1, variable=self.variable, offvalue=False, onvalue=True,
                                        command=self.delete_switch, bootstyle="round-toggle")
        switch_button.grid(row=2, column=1, pady=5)
        # 删除人员配置按钮
        self.del_button = ttk.Button(tab1, text="删除人员配置", bootstyle="danger-outline", command=self.delete,
                                     state=DISABLED)
        self.del_button.grid(row=2, column=2, columnspan=2, pady=5)

        # 生成的排班表展示文本框
        self.show_text = ttk.Text(tab1, wrap=ttk.WORD, width=39, height=10, state=DISABLED)  # 默认text文本框不可编辑
        self.show_text.grid(row=3, column=0, columnspan=4)
        # # ------------------------------------生成排班------------------------------------#

        # # ------------------------------------查看记录------------------------------------#
        # 生成的排班记录展示文本框
        self.show_record_text = ttk.Text(tab2, wrap=ttk.WORD, width=39, height=16, state=DISABLED)
        self.show_record_text.pack(expand=1, fill=BOTH)
        # # ------------------------------------查看记录------------------------------------#

        # # ------------------------------------当前时间------------------------------------#
        # 当前时间标签
        self.current_time_label = ttk.Label(self.root, bootstyle=PRIMARY)
        self.current_time_label.pack()
        # # ------------------------------------当前时间------------------------------------#

    def generate(self):
        """
        TODO:点击【生成排班】按钮时对应的事件
        :return:
        """
        pass

    def delete_switch(self):
        """
        TODO:点击【删除人员配置开关设置】按钮时对应的事件
        :return:
        """
        pass

    def delete(self):
        """
        TODO:点击【删除人员配置】按钮时对应的事件
        :return:
        """
        pass

    def update_time(self):
        """
        获取当前时间和本年第几周,每隔1s更新
        :return:
        """
        current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        week_num = int(time.strftime("%W")) + 1
        self.current_time_label.config(text=f"{current_time}  第{week_num}周")
        self.current_time_label.after(1000, self.update_time)


if __name__ == "__main__":
    root = ttk.Window(
        title="排排班",  # 窗口标题
        themename="superhero"  # 主题
    )
    root.place_window_center()  # 设置窗口居中(左上角坐标在屏幕中间?)
    root.iconbitmap('icon.ico')  # 更改GUI图标
    root.resizable(width=False, height=False)  # 设置窗口大小不可变
    GUI(root)  # 展示GUI界面
    root.mainloop()  # 进入消息循环

运行结果:

Python制作排班小工具【二】_ttkbootstrap_02Python制作排班小工具【二】_工具开发_03Python制作排班小工具【二】_ttkbootstrap_04

三、结语

1.ttkbootstrap第三方库需要单独安装,GUI图标只支持.ico格式

2.可通过Window的themename参数切换主题样式,参考官方文档

2.页面元素的布局设计不太科学,基本是试出来的

3.仅展示页面元素,暂未编写按钮对应的事件

标签:group,Python,text,self,ttk,num,排班,制作
From: https://blog.51cto.com/u_16379005/8645261

相关文章

  • 无涯教程-Python - 单词标记化
    单词标签化是将大量文本样本拆分为单词的过程,这是自然语言处理任务的要求,其中每个单词都需要捕获并接受以便进一步分析,如对特定情感进行分类和计数等,自然语言工具包(NLTK)是用于实现此目的的库,在继续进行python之前安装NLTK单词标签化程序。condainstall-canacondanltk接......
  • 聪明办法学python——Task05,06
    聪明办法学python——Task5,Task6Task05——循环for循环和循环范围特点:基于提供的范围,重复执行特定范围的操作forxinrange(n,m+1):  count+=1returncountrange(x,y)是左闭右开的区间,不含yreturnsum(range(m,n+1))range的第三个参数是步长,可正可负foriinrange(......
  • 聪明办法学python——06,07
    聪明办法学python——Task6,Task7Task06——循环for循环和循环范围特点:基于提供的范围,重复执行特定范围的操作forxinrange(n,m+1):  count+=1returncountrange(x,y)是左闭右开的区间,不含yreturnsum(range(m,n+1))range的第三个参数是步长,可正可负foriinrange(......
  • Python中使用OpenpyXL操作Excel
    一、安装openpyxl库可以使用命令pipinstallopenpyxl指定版本与切换国内源请查看pyMySQL库那那一文章的详细解答Python中使用PyMySQL库连接MySQL数据库-AiniIT琦玉-博客园(cnblogs.com)二、读取Excel1、读取全部读取excel写法逻辑如下:读取#调用函数,传递文件名#......
  • 无涯教程-Python - 处理非结构化数据
    以行和列格式存在的数据,或可以轻松转换为行和列的数据,以便以后可以很好地适合数据库的数据称为结构化数据,例如CSV,TXT,XLS文件等。读取数据在下面的示例中,无涯教程获取一个文本文件并读取该文件,其中分离了其中的每一行,接下来,可以将输出分为更多的行和单词。filename='path\inp......
  • Python中使用PyMySQL库连接MySQL数据库
    一、什么是PyMysqlPyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,PyMySQL遵循Python数据库APIv2.0规范,并包含了pure-PythonMySQL客户端库。二、安装PyMysql可以使用命令pipinstallpymysql如果需要确定版本号,则可以使用以下命令pipinstall<包名......
  • Python中的装饰器
    一、装饰器的作用装饰器是Python中一种强大的编程工具,它允许我们在不修改原始函数代码的情况下,动态地增加功能或修改函数行为。装饰器提供了一种简洁而优雅的方式来修改、扩展或包装函数,使代码更具可读性和可维护性。装饰器的主要作用包括:添加额外的功能或逻辑,如日志记录、性......
  • python装饰器
    装饰器本质上是一个Python函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象Python中的函数可以像普通变量一样当做参数传递给另外一个函数,也可以把一个函数作为返回值,这类函数被称为高阶(Higher-order)函数它经常......
  • python HTTP Server 文件上传与下载
    pythonHTTPServer文件上传与下载实现在局域网(同一WIFI下)文件上传与下载该模块通过实现标准GET在BaseHTTPServer上构建和HEAD请求。(将所有代码粘贴到同一个py文件中,即可使用)所需包基于python3版本实现,python2版本无涉猎importosimportsysimportargparseimport......
  • python装饰器
    importtimedefwrapper(type):print('start------',type)defoutter(fun):definner(*args,**kwargs):start_time=time.time()fun(*args,**kwargs)end_time=time.time()print('ru......