Python调用ChatGPT制作基于Tkinter的桌面时钟
作者:小锋学长生活大爆炸 发布时间:2023-05-11 08:23:23
标签:Python,ChatGPT,时钟
描述
给ChatGPT的描述内容:
python在桌面上显示动态的文字,不要显示窗口边框。窗口背景和标签背景都是透明的,但标签内的文字是有颜色。使用tkinter库实现,并以class的形式书写,方便用户对内容进行扩展开发。
窗口默认出现在屏幕的中间位置。窗口中的标签需要包含两项内容。其中一项用于实时显示当前的日期和时间,精确到毫秒。另一项从txt文件中读取显示,若没有txt文件则显示“None”。
在未锁定状态下,鼠标可以拖动窗口。在锁定状态下,窗口无法通过鼠标的拖动而移动。在窗口中添加一个“锁定”按钮,当鼠标移动到窗口上方时,显示“锁定”按钮,鼠标移走后,隐藏“锁定”按钮。通过“锁定”按钮,窗口进入锁定状态。在锁定状态下,当鼠标移动到窗口上方时,显示一个“解除锁定”的按钮,鼠标移走后,隐藏该“解除锁定”按钮。通过点击“解除锁定”按钮,进入未锁定状态。锁定和未锁定状态是互相切换的。
给窗口添加一个鼠标右键的功能,在右键菜单中,可以点击“退出”,从而退出应用。
窗口中的内容居中显示。
代码
给出的代码,并经过微调:
import tkinter as tk
import datetime
import math
import locale
# Set the locale to use UTF-8 encoding
locale.setlocale(locale.LC_ALL, 'en_US.utf8')
class TransparentWindow(tk.Tk):
def __init__(self, text_file=None):
super().__init__()
self.attributes('-alpha', 1) # 设置窗口透明度
# self.attributes('-topmost', True) # 窗口置顶
# self.attributes('-transparentcolor', '#000000')
self.overrideredirect(True) # 去掉窗口边框
self.locked = False # 初始化锁定状态
self.mouse_x = 0
self.mouse_y = 0
self.config(bg='#000000', highlightthickness=0, bd=0)
# 获取屏幕尺寸和窗口尺寸,使窗口居中
screen_width = self.winfo_screenwidth()
screen_height = self.winfo_screenheight()
window_width = 400
window_height = 100
x = (screen_width - window_width) // 2
y = (screen_height - window_height) // 2
self.geometry('{}x{}+{}+{}'.format(window_width, window_height, x, y))
# 添加日期时间标签
self.datetime_label = tk.Label(self, text='', font=('Arial', 20), fg='#FFFFFF', bg='#000000')
self.datetime_label.place(relx=0.5, y=20, anchor='center')
# 提示标签
self.note_label = tk.Label(self, text='123', font=('Arial', 14), fg='#FFFFFF', bg='#000000')
self.note_label.place(relx=0.5, y=50, anchor='center')
# 文本标签
self.text_label = tk.Label(self, text='', font=('Arial', 14), fg='#FFFFFF', bg='#000000')
self.text_label.place(relx=0.5, y=80, anchor='center')
# 添加锁定按钮
self.lock_button = tk.Button(self, text='锁定', font=('Arial', 10), command=self.toggle_lock)
self.toggle_lock_button(True)
self.toggle_lock_button(False)
# 添加解锁按钮
self.unlock_button = tk.Button(self, text='解除锁定', font=('Arial', 10), command=self.toggle_lock)
self.toggle_unlock_button(True)
self.toggle_unlock_button(False)
# 定时更新日期时间标签
self.update_datetime()
# 定时更新text标签
self.update_text_label()
# 定时更新note标签
self.update_note_label()
# 绑定鼠标事件
self.bind('<Button-1>', self.on_left_button_down)
self.bind('<ButtonRelease-1>', self.on_left_button_up)
self.bind('<B1-Motion>', self.on_mouse_drag)
self.bind('<Enter>', self.on_mouse_enter)
self.bind('<Leave>', self.on_mouse_leave)
# 创建右键菜单
self.menu = tk.Menu(self, tearoff=0)
self.menu.add_command(label="退出", command=self.quit)
self.bind("<Button-3>", self.show_menu)
def toggle_lock_button(self, show=True):
if show:
self.lock_button.place(relx=1, rely=0.85, anchor='e')
else:
self.lock_button.place_forget()
def toggle_unlock_button(self, show=True):
if show:
self.unlock_button.place(relx=1, rely=0.85, anchor='e')
else:
self.unlock_button.place_forget()
def show_menu(self, event):
self.menu.post(event.x_root, event.y_root)
def update_datetime(self):
now = datetime.datetime.now().strftime('%Y-%m-%d \u270d %H:%M:%S.%f')[:-4]
msg = f'{now}'
self.datetime_label.configure(text=msg)
self.after(10, self.update_datetime)
def update_text_label(self):
now = '小锋学长生活大 * '
self.text_label.configure(text=now)
self.after(1000, self.update_text_label)
def update_note_label(self):
# 指定日期,格式为 年-月-日
specified_start_date = datetime.date(2023, 2, 20)
specified_end_date = datetime.date(2023, 7, 9)
today = datetime.date.today()
# 计算距离指定日期过了多少周
start_delta = today - specified_start_date
num_of_weeks = math.ceil(start_delta.days / 7)
# 计算距离指定日期剩余多少周
end_delta = specified_end_date - today
remain_weeks = math.ceil(end_delta.days / 7)
msg = f'当前第{num_of_weeks}周, 剩余{remain_weeks}周({end_delta.days}天)'
self.note_label.configure(text=msg)
self.after(1000*60, self.update_note_label)
def toggle_lock(self):
if self.locked:
self.locked = False
self.toggle_lock_button(True)
self.toggle_unlock_button(False)
else:
self.locked = True
self.toggle_lock_button(False)
self.toggle_unlock_button(True)
def on_left_button_down(self, event):
self.mouse_x = event.x
self.mouse_y = event.y
def on_left_button_up(self, event):
self.mouse_x = 0
self.mouse_y = 0
def on_mouse_drag(self, event):
if not self.locked:
x = self.winfo_x() + event.x - self.mouse_x
y = self.winfo_y() + event.y - self.mouse_y
self.geometry('+{}+{}'.format(x, y))
def on_mouse_leave(self, event):
self.lock_button.place_forget()
self.unlock_button.place_forget()
def on_mouse_enter(self, event):
if not self.locked:
self.toggle_lock_button(True)
self.toggle_unlock_button(False)
else:
self.toggle_lock_button(False)
self.toggle_unlock_button(True)
if __name__ == '__main__':
app = TransparentWindow(text_file='text.txt')
app.mainloop()
效果
说明
关于背景颜色、日期等等内容,大家可以修改相应的代码。
来源:https://blog.csdn.net/sxf1061700625/article/details/129721502


猜你喜欢
- 背景App落地页迭代频繁,且需兼容App与各小App,目前是单向前进迭代,会存在以下问题:跳转原生交互;如:某个落地页增加了只有主App的才
- Image and text elements that appear in another element are called floa
- 本人之前写了一套基于unnitest框架的UI自动化框架,但是发现了pytest框架之后觉得unnitest太low,现在重头开始学pyte
- AXObject可用来解决IE需要激活 ActiveX 控件和生成控件调用代码 AXObjec
- vue项目无法删除问题今天删除本地的vue项目,一直提示“操作无法完成,因为其中的文件夹或文件已在另一个程序组打开,请关
- python3.6在运行tkinter时要选择 run as Python unit-test,否则报错 ModuleNotFoundErr
- Heroku是一个很棒的平台,它有很多的控件,并且搭建环境相对来说也比较容易。本指南中,我将一步一步指导你在Heroku平台上部署一个简单地
- 一、单字节SQL注入MYSQL的SQL注入已经由来已久,以下是普遍采用的注入步骤:1、在GET参数上加一个/*或者#(mysql专有的注释)
- 详解微信小程序中的页面代码中的模板的封装 最近在进行微信小程序中的页面开发,其实在c++或者说是js中都
- 从某种程度上说,判断一个网页设计师是否优秀,可以从其在WEB开发(或网页设计)中是否合理的采用各种图片格式得出结论。事实上,或许所有人都知道
- GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。1、概述“Group By”从字面意义上理解就是根据“By”指定的
- 前言: 在 MySQL 运维过程中,锁等待和死锁问题是令各位 DBA 及开发同学非常头痛的事。出现此类问题会造成业务回滚、卡顿等故
- 1、定义全局变'''全局变量: X 和 O 表示两方的棋子; EMPTY 表示棋位为空; TIE 表示平局; NUM
- 很早就听说韩国网站的设计师们很会利用空间,来创造更多的信息承载量.最近浏览了几个韩国SHOPPING网站果不其然,就拿小小的广告轮播来说,非
- 这篇文章主要介绍了基于python实现从尾到头打印链表,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- Python 提供了多个图形开发界面的库。Tkinter就是其中之一。 Tkinter 模块(Tk 接口)是 Python 的标准 Tk G
- python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。smtp协议的基本命令包括:HELO 向服
- python 里面与时间有关的模块主要是 time 和 datetime如果想获取系统当前时间戳:time.time(),是一个float型
- 本文做的是基于opencv将视频帧转成图片输出,由于一个视频包含的帧数过多,经常我们并不是需要它的全部帧转成图片,因此我们希望可以设置每隔多
- 为了实现这样的小工具,我们先设想有下面这些功能。1、可以自定义整理某一个路径下面的所有需要被整理的文件。2、默认情况下,使用文件后缀作为同一