python编写不少于一百行代码实现:日程(待办事项) 提醒,要求用户可以自己手动输入设置提前多久开始提醒,一次提醒多长时间,每次提醒时间间隔多久,是否重复,什么时侯重复(每天,每周,每月,每年)且要求界面美观的复杂小程序——基于Timer和tkinter

时间: 2023-08-03 22:09:28 浏览: 342
好的,我来给您编写这个程序。 首先,我们需要导入必要的模块:`tkinter`、`datetime`、`time`和`threading`。其中,`tkinter`用于构建GUI界面,`datetime`用于处理日期和时间,`time`用于等待时间,`threading`用于多线程。 ```python import tkinter as tk from datetime import datetime, timedelta import time import threading ``` 接下来,我们需要定义一个`Schedule`类,用于管理日程。在这个类中,我们需要定义一些属性和方法,如下: ```python class Schedule: def __init__(self, title, start_time, duration, interval, advance, repeat, repeat_type): self.title = title self.start_time = start_time self.duration = duration self.interval = interval self.advance = advance self.repeat = repeat self.repeat_type = repeat_type self.completed = False self.paused = False self.remind_thread = None def start(self): self.completed = False self.paused = False self.remind_thread = threading.Thread(target=self.remind) self.remind_thread.start() def pause(self): self.paused = True def resume(self): self.paused = False def stop(self): self.completed = True def remind(self): while not self.completed: if not self.paused: now = datetime.now() start_time = datetime.strptime(self.start_time, '%Y-%m-%d %H:%M:%S') delta = start_time - now + timedelta(minutes=self.advance) if delta.total_seconds() <= 0: self.show_reminder() if self.repeat: self.repeat_reminder() else: self.completed = True else: time.sleep(delta.total_seconds()) def show_reminder(self): duration = timedelta(minutes=self.duration) end_time = datetime.strptime(self.start_time, '%Y-%m-%d %H:%M:%S') + duration message = f"{self.title}\nStart time: {self.start_time}\nEnd time: {end_time.strftime('%Y-%m-%d %H:%M:%S')}" root = tk.Tk() root.title("Reminder") label = tk.Label(root, text=message, font=('Arial', 18)) label.pack() root.mainloop() def repeat_reminder(self): if self.repeat_type == 'daily': start_time = datetime.strptime(self.start_time, '%Y-%m-%d %H:%M:%S') + timedelta(days=1) self.start_time = start_time.strftime('%Y-%m-%d %H:%M:%S') elif self.repeat_type == 'weekly': start_time = datetime.strptime(self.start_time, '%Y-%m-%d %H:%M:%S') + timedelta(weeks=1) self.start_time = start_time.strftime('%Y-%m-%d %H:%M:%S') elif self.repeat_type == 'monthly': month = datetime.strptime(self.start_time, '%Y-%m-%d %H:%M:%S').month + 1 year = datetime.strptime(self.start_time, '%Y-%m-%d %H:%M:%S').year if month > 12: month = 1 year += 1 start_time = datetime(year, month, datetime.strptime(self.start_time, '%Y-%m-%d %H:%M:%S').day, datetime.strptime(self.start_time, '%Y-%m-%d %H:%M:%S').hour, datetime.strptime(self.start_time, '%Y-%m-%d %H:%M:%S').minute) self.start_time = start_time.strftime('%Y-%m-%d %H:%M:%S') elif self.repeat_type == 'yearly': year = datetime.strptime(self.start_time, '%Y-%m-%d %H:%M:%S').year + 1 month = datetime.strptime(self.start_time, '%Y-%m-%d %H:%M:%S').month day = datetime.strptime(self.start_time, '%Y-%m-%d %H:%M:%S').day hour = datetime.strptime(self.start_time, '%Y-%m-%d %H:%M:%S').hour minute = datetime.strptime(self.start_time, '%Y-%m-%d %H:%M:%S').minute start_time = datetime(year, month, day, hour, minute) self.start_time = start_time.strftime('%Y-%m-%d %H:%M:%S') ``` 在这个类中,我们定义了一个初始化方法`__init__`,用于初始化日程的属性。`start`方法用于启动日程,`pause`方法用于暂停日程,`resume`方法用于恢复日程,`stop`方法用于停止日程。`remind`方法是一个循环,用于等待日程的开始时间,并在开始时间前`advance`分钟提醒用户。如果设置了重复提醒,则在提醒后继续等待下一次提醒时间。`show_reminder`方法用于显示提醒窗口,`repeat_reminder`方法用于计算下一次重复提醒的时间。 接下来,我们需要定义一个`ScheduleManager`类,用于管理所有的日程。在这个类中,我们需要定义一些属性和方法,如下: ```python class ScheduleManager: def __init__(self): self.schedules = [] self.timer_thread = None def add_schedule(self, schedule): self.schedules.append(schedule) def start(self): self.timer_thread = threading.Thread(target=self.timer) self.timer_thread.start() def stop(self): for schedule in self.schedules: schedule.stop() self.timer_thread.join() def timer(self): while True: now = datetime.now() for schedule in self.schedules: start_time = datetime.strptime(schedule.start_time, '%Y-%m-%d %H:%M:%S') delta = start_time - now if delta.total_seconds() <= 0 and not schedule.completed: schedule.start() time.sleep(1) ``` 在这个类中,我们定义了一个初始化方法`__init__`,用于初始化管理器的属性。`add_schedule`方法用于添加日程到管理器中。`start`方法用于启动管理器,`stop`方法用于停止管理器。`timer`方法是一个循环,用于检查所有的日程是否已经到达开始时间,并启动日程。 最后,我们需要定义一个GUI界面,用于让用户输入日程的信息并添加到管理器中。在这个界面中,我们需要定义一些控件,如下: ```python class Application: def __init__(self, master): self.master = master self.master.title("Schedule Reminder") self.master.geometry("400x400") self.title_label = tk.Label(self.master, text="Title:", font=('Arial', 18)) self.title_label.pack() self.title_entry = tk.Entry(self.master, font=('Arial', 18)) self.title_entry.pack() self.start_time_label = tk.Label(self.master, text="Start Time (YYYY-MM-DD HH:MM:SS):", font=('Arial', 18)) self.start_time_label.pack() self.start_time_entry = tk.Entry(self.master, font=('Arial', 18)) self.start_time_entry.pack() self.duration_label = tk.Label(self.master, text="Duration (minutes):", font=('Arial', 18)) self.duration_label.pack() self.duration_entry = tk.Entry(self.master, font=('Arial', 18)) self.duration_entry.pack() self.interval_label = tk.Label(self.master, text="Interval (minutes):", font=('Arial', 18)) self.interval_label.pack() self.interval_entry = tk.Entry(self.master, font=('Arial', 18)) self.interval_entry.pack() self.advance_label = tk.Label(self.master, text="Advance (minutes):", font=('Arial', 18)) self.advance_label.pack() self.advance_entry = tk.Entry(self.master, font=('Arial', 18)) self.advance_entry.pack() self.repeat_label = tk.Label(self.master, text="Repeat:", font=('Arial', 18)) self.repeat_label.pack() self.repeat_var = tk.BooleanVar() self.repeat_checkbox = tk.Checkbutton(self.master, text="Repeat", variable=self.repeat_var, font=('Arial', 18)) self.repeat_checkbox.pack() self.repeat_type_label = tk.Label(self.master, text="Repeat Type:", font=('Arial', 18)) self.repeat_type_label.pack() self.repeat_type_var = tk.StringVar() self.repeat_type_var.set("daily") self.repeat_type_optionmenu = tk.OptionMenu(self.master, self.repeat_type_var, "daily", "weekly", "monthly", "yearly") self.repeat_type_optionmenu.config(font=('Arial', 18)) self.repeat_type_optionmenu.pack() self.add_button = tk.Button(self.master, text="Add", font=('Arial', 18), command=self.add_schedule) self.add_button.pack() self.schedule_manager = ScheduleManager() def add_schedule(self): title = self.title_entry.get() start_time = self.start_time_entry.get() duration = int(self.duration_entry.get()) interval = int(self.interval_entry.get()) advance = int(self.advance_entry.get()) repeat = self.repeat_var.get() repeat_type = self.repeat_type_var.get() schedule = Schedule(title, start_time, duration, interval, advance, repeat, repeat_type) self.schedule_manager.add_schedule(schedule) def start(self): self.schedule_manager.start() ``` 在这个界面中,我们定义了一个初始化方法`__init__`,用于初始化界面的控件。`add_schedule`方法用于获取用户输入的日程信息并添加到管理器中。`start`方法用于启动管理器。 最后,我们需要创建一个`Application`对象并启动界面: ```python root = tk.Tk() app = Application(root) app.start() root.mainloop() ``` 这样,我们就完成了这个程序的编写。完整的代码如下:

相关推荐

application/x-gzip
如果你是一个小型的办公网络,你可以创建一个服务器来进行日程安排,这只是一个开源的小服务器,你果你需要大的免费的软件去http://www.bedework.org/bedework/下载 使用教程 Installation Dependencies Radicale is written in pure python and does not depend on any librabry. It is known to work on Python 2.5, 2.6, 3.0 and 3.1 [1]. Linux users certainly have Python already installed. For Windows and MacOS users, please install Python [2] thanks to the adequate installer. [1] See Python Versions and OS Support for further information. [2] Python download page. Radicale Radicale can be freely downloaded on the project website, download section. Just get the file and unzip it in a folder of your choice. CalDAV Clients At this time Radicale has been tested and works fine with the latests version of Mozilla Sunbird (versions 0.9+), Mozilla Lightning (0.9+), and Evolution (2.30+). More clients will be supported in the future. However, it may work with any calendar client which implements CalDAV specifications too (luck is highly recommanded). To download Sunbird, go to the Sunbird project website and choose the latest version. Follow the instructions depending on your operating system. Simple Usage Starting Server To start Radicale CalDAV server, you have to launch the file called radicale.py located in the root folder of the software package. Using Sunbird or Lightning After starting Sunbird or Lightning, click on File and New Calendar. Upcoming window asks you about your calendar storage. Chose a calendar On the Network, otherwise Sunbird will use its own file system storage instead of Radicale's one and your calendar won't be remotely accessible. Next window asks you to provide information about remote calendar access. Protocol used by Radicale is CalDAV. A standard location for a basic use of a Radicale calendar is http://localhost:5232/user/calendar/, where you can replace user and calendar by some strings of your choice. Calendars are automatically created if needed. You can now customize your calendar by giving it a nickname and a color. This

最新推荐

recommend-type

不到40行代码用Python实现一个简单的推荐系统

主要给大家介绍了如何利用不到40行python代码实现一个简单的推荐系统,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
recommend-type

Python中实现一行拆多行和多行并一行的示例代码

主要介绍了Python中实现一行拆多行和多行并一行的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

vscode写python时的代码错误提醒和自动格式化的方法

主要介绍了vscode写python时的代码错误提醒和自动格式化的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

python 代码实现k-means聚类分析的思路(不使用现成聚类库)

主要介绍了python 代码实现k-means聚类分析(不使用现成聚类库),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

Python 40行代码实现人脸识别功能

很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了。其实如果你不是非要深究其中的...今天我们就来看看如何在40行代码以内简单地实现人脸识别。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】增量式PID的simulink仿真实现

# 2.1 Simulink仿真环境简介 Simulink是MATLAB中用于建模、仿真和分析动态系统的图形化环境。它提供了一个直观的用户界面,允许用户使用块和连接线来创建系统模型。Simulink模型由以下元素组成: - **子系统:**将复杂系统分解成更小的、可管理的模块。 - **块:**代表系统中的组件,如传感器、执行器和控制器。 - **连接线:**表示信号在块之间的流动。 Simulink仿真环境提供了广泛的块库,涵盖了各种工程学科,包括控制系统、电子和机械工程。它还支持用户自定义块的创建,以满足特定仿真需求。 # 2. Simulink仿真环境的搭建和建模 ### 2.
recommend-type

训练集和测试集的准确率都99%,但是预测效果不好

即使训练集和测试集的准确率都很高,但是在实际的预测中表现不佳,可能会有以下几个原因: 1. 数据质量问题:模型训练和测试的数据可能存在问题,比如数据标签错误、数据集采样不均衡、数据集中存在异常值等问题,这些问题可能会导致模型在实际预测中表现不佳。 2. 特征工程问题:模型的特征工程可能存在问题,导致模型无法很好地捕捉数据的特征,从而影响预测效果。 3. 模型选择问题:模型的选择可能不合适,比如选择的模型太简单,无法很好地拟合数据,或者选择的模型太复杂,导致过拟合等问题。 4. 超参数调整问题:模型的超参数可能没有调整到最佳状态,需要进行调整。 针对以上可能的原因,可以采取相应的措施进
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。