【教程】使用ChatGPT制作基于Tkinter的桌面时钟

这篇具有很好参考价值的文章主要介绍了【教程】使用ChatGPT制作基于Tkinter的桌面时钟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

描述

代码

效果

说明

下载

开源链接:GitHub - 1061700625/Tkinter_Desktop_Clock: 基于Tkinter的桌面时钟小工具

描述

        给ChatGPT的描述内容:

        python在桌面上显示动态的文字,不要显示窗口边框。窗口背景和标签背景都是透明的,但标签内的文字是有颜色。使用tkinter库实现,并以class的形式书写,方便用户对内容进行扩展开发。

        窗口默认出现在屏幕的中间位置。窗口中的标签需要包含两项内容。其中一项用于实时显示当前的日期和时间,精确到毫秒。另一项从txt文件中读取显示,若没有txt文件则显示“None”。

        在未锁定状态下,鼠标可以拖动窗口。在锁定状态下,窗口无法通过鼠标的拖动而移动。在窗口中添加一个“锁定”按钮,当鼠标移动到窗口上方时,显示“锁定”按钮,鼠标移走后,隐藏“锁定”按钮。通过“锁定”按钮,窗口进入锁定状态。在锁定状态下,当鼠标移动到窗口上方时,显示一个“解除锁定”的按钮,鼠标移走后,隐藏该“解除锁定”按钮。通过点击“解除锁定”按钮,进入未锁定状态。锁定和未锁定状态是互相切换的。

        给窗口添加一个鼠标右键的功能,在右键菜单中,可以点击“退出”,从而退出应用。

        窗口中的内容居中显示。

        添加 右键窗口显示“改变颜色”子菜单,点击后,弹出颜色选择框,通过选择不同的颜色,可以改变窗口的背景颜色。

        添加 右键窗口显示“置顶”子菜单,点击后,可以使当前窗口一直保持在最前面。在置顶状态下,再右键窗口,改为显示“取消置顶”。

        添加右键“修改日期”子菜单,点击后,弹出开始日期选择框和结束日期选择框,选择完毕后,更新到self.start_date和self.end_date,并立即调用update_note_label函数。

        添加 右键窗口显示“修改note”子菜单,点击后,弹出内容输入框,输入框默认显示“小锋学长生活大爆炸”。点击确认后,输入框的内容更新到self.text_label。只需要给出修改的关键代码。

        启动时从http://xfxuezhang.cn/web/share/version获取desktop_clock.txt文件,根据内容与当前版本是否一致,若不一致则弹窗提示有更新。

        添加右键“开机自启动”选项,设置后,允许pc开机后自动启动当前软件。并且,当设置了开机自启动后,再次点击,应该需要 取消开机自启动。

        将一些配置参数存放入注册表中,在启动软件时,从注册表中读取参数,并更新到软件中。当用户在软件中更改了配置时,需要将改动更新到注册表中。

【教程】使用ChatGPT制作基于Tkinter的桌面时钟

代码

给出的代码,并经过微调:

import tkinter as tk
import datetime
import math
import locale
import os, sys
from tkinter.colorchooser import askcolor
import webbrowser
import tkinter.messagebox as messagebox
import tkinter.ttk as ttk
import tkcalendar
import babel.numbers
import requests
import tkinter.simpledialog
import winreg

# Set the locale to use UTF-8 encoding
locale.setlocale(locale.LC_ALL, 'en_US.utf8')
VERSION = '20230406'
CONFIG_REG_PATH = r'SOFTWARE\desktop_clock\Settings'


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)
        self.window_width = 400
        self.window_height = 100

        # # 获取屏幕尺寸和窗口尺寸,使窗口居中
        # screen_width = self.winfo_screenwidth()
        # screen_height = self.winfo_screenheight()
        # x = (screen_width - self.window_width) // 2
        # y = (screen_height - self.window_height) // 2
        # self.geometry('{}x{}+{}+{}'.format(self.window_width, self.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.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.menu.add_command(label="窗口置顶", command=self.topmost_on)
        # 添加“改变颜色”子菜单
        self.menu.add_command(label="修改颜色", command=self.choose_color)
        # 添加“修改日期”子菜单
        self.menu.add_command(label="修改日期", command=self.modify_date)
        # 添加“修改note”子菜单
        self.menu.add_command(label='修改Note', command=self.edit_text_labele)
        # 添加“开机自启动”子菜单
        self.menu.add_command(label="开机自启", command=self.toggle_startup)
        # 添加“恢复出厂设置”子菜单
        self.menu.add_command(label="恢复设置", command=self.init_config_to_registry)
        # 添加“关于”子菜单
        self.menu.add_command(label="关于我们", command=self.about_me)
        self.bind("<Button-3>", self.show_menu)

        self.update_config_from_registry()
        # 定时更新日期时间标签
        self.update_datetime()
        # 定时更新text标签
        self.update_text_label()
        # 定时更新note标签
        self.update_note_label()
        self.check_version()
        
    

    def update_config_from_registry(self):
        # Get settings from registry or set default values
        self.start_date = self.get_value_from_registry('start_date', '2023/2/20', write=True)
        self.end_date = self.get_value_from_registry('end_date', '2023/7/9', write=True)
        startup = self.get_value_from_registry('startup', False)
        self.menu.entryconfig(5, label='取消自动' if startup else '开机自启')
        topmost = self.get_value_from_registry('topmost', False)
        self.attributes('-topmost', True if topmost else False)
        self.menu.entryconfig(1, label='取消置顶' if topmost else '窗口置顶')
        background_color = self.get_value_from_registry('background_color', '#000000', write=True)
        self.config(bg=background_color)
        self.datetime_label.config(bg=background_color)
        self.note_label.config(bg=background_color)
        self.text_label.config(bg=background_color)
        self.locked = self.get_value_from_registry('lock', False)
        self.toggle_lock_button(False if self.locked else True)
        self.toggle_unlock_button(True if self.locked else False)
        self.text_label.configure(text=self.get_value_from_registry('text_label', '小锋学长生活大爆炸', write=True))
        
        screen_width = self.winfo_screenwidth()
        screen_height = self.winfo_screenheight()
        win_x = (screen_width - self.window_width) // 2
        win_y = (screen_height - self.window_height) // 2
        x = self.get_value_from_registry('win_x', str(win_x))
        y = self.get_value_from_registry('win_y', str(win_y))
        self.geometry('{}x{}+{}+{}'.format(self.window_width, self.window_height, x, y))

    def init_config_to_registry(self, first=False):
        self.set_value_to_registry('start_date', '2023/2/20')
        self.set_value_to_registry('end_date', '2023/7/9')
        self.set_value_to_registry('startup', None)
        self.set_value_to_registry('topmost', None)
        self.set_value_to_registry('background_color', '#000000')
        self.set_value_to_registry('lock', None)
        self.set_value_to_registry('text_label', '小锋学长生活大爆炸')

        screen_width = self.winfo_screenwidth()
        screen_height = self.winfo_screenheight()
        x = (screen_width - self.window_width) // 2
        y = (screen_height - self.window_height) // 2
        self.set_value_to_registry('win_x', str(x))
        self.set_value_to_registry('win_y', str(y))

        if not first:
            messagebox.showinfo("提示", "重启生效")



    
    def check_version(self):
        url = 'http://xfxuezhang.cn/web/share/version/desktop_clock.txt'
        try:
            resp = requests.get(url, timeout=2).text.strip()
            if resp != VERSION:
                if messagebox.askyesno('更新提示', '发现新版本,是否前往蓝奏云下载?密码:c9o1'):
                    webbrowser.open('https://xfxuezhang.lanzouo.com/b09ubrasb')
        except:
            pass


    def get_value_from_registry(self, query, default=None, write=False, vtype=winreg.REG_SZ):
        # 从注册表中读取参数,如果没有,则使用默认值
        try:
            with winreg.OpenKey(winreg.HKEY_CURRENT_USER, CONFIG_REG_PATH, access=winreg.KEY_READ) as key:
                value = winreg.QueryValueEx(key, query)[0]
        except:
            value = default
            if write:
                # 将默认值存储到注册表中
                with winreg.CreateKey(winreg.HKEY_CURRENT_USER, CONFIG_REG_PATH) as key:
                    winreg.SetValueEx(key, query, 0, vtype, default)
        return value

    def set_value_to_registry(self, query, value=None, vtype=winreg.REG_SZ):
        if value is not None:
            with winreg.CreateKey(winreg.HKEY_CURRENT_USER, CONFIG_REG_PATH) as key:
                winreg.SetValueEx(key, query, 0, vtype, value)
        else:
            try:
                with winreg.OpenKey(winreg.HKEY_CURRENT_USER, CONFIG_REG_PATH, access=winreg.KEY_ALL_ACCESS) as key:
                    winreg.DeleteValue(key, query)
            except:
                pass


    def check_startup_enabled(self):
        key = winreg.OpenKey(
            winreg.HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
            access=winreg.KEY_READ)
        app_path = os.path.abspath(sys.argv[0])
        app_name = os.path.basename(app_path)
        try:
            value, type = winreg.QueryValueEx(key, app_name)
        except WindowsError:
            return False
        return value == app_path
    
    def toggle_startup(self):
        key = winreg.OpenKey(
            winreg.HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
            access=winreg.KEY_ALL_ACCESS)
        app_path = os.path.abspath(sys.argv[0])
        app_name = os.path.basename(app_path)
        if self.check_startup_enabled():
            winreg.DeleteValue(key, app_name)
            self.menu.entryconfig(5, label='开机自启')
            messagebox.showinfo("提示", "已取消开机自启动")
        else:
            winreg.SetValueEx(key, app_name, 0, winreg.REG_SZ, app_path)
            self.menu.entryconfig(5, label='取消自启')
            messagebox.showinfo("提示", "已设置开机自启动")
        key.Close()
        self.set_value_to_registry('startup', '1' if self.check_startup_enabled() else None)


    def about_me(self):
        # webbrowser.open_new_tab('http://www.xfxuezhang.cn')
        messagebox.showinfo("关于", "暂时没什么内容")

    # 选择日期
    def modify_date(self):
        top = tk.Toplevel(self)
        # 获取屏幕尺寸和窗口尺寸,使窗口居中
        screen_width = top.winfo_screenwidth()
        screen_height = top.winfo_screenheight()
        window_width = 175
        window_height = 100
        x = (screen_width - window_width) // 2
        y = (screen_height - window_height) // 2
        top.geometry('{}x{}+{}+{}'.format(window_width, window_height, x, y))
        top.title('选择日期')
        tk.Label(top, text='开始日期:').grid(row=0, column=0)
        start_date = tkcalendar.DateEntry(top, width=12, background='darkblue', foreground='white', date_pattern='yyyy/mm/dd', date=self.start_date, justify='center')
        start_date.grid(row=0, column=1)
        tk.Label(top, text='结束日期:').grid(row=1, column=0)
        end_date = tkcalendar.DateEntry(top, width=12, background='darkblue', foreground='white', date_pattern='yyyy/mm/dd', date=self.end_date, justify='center')
        end_date.grid(row=1, column=1)
    
        def update_dates():
            self.start_date = start_date.get_date().strftime('%Y/%m/%d')
            self.end_date = end_date.get_date().strftime('%Y/%m/%d')
            self.update_note_label()
            top.destroy()
            self.set_value_to_registry('start_date', self.start_date)
            self.set_value_to_registry('end_date', self.end_date)
        
        button = tk.Button(top, text="确定", command=update_dates)
        button.grid(row=2, column=0, columnspan=2, pady=10)
        
    # 窗口置顶
    def topmost_on(self):
        if self.attributes('-topmost'):
            self.attributes('-topmost', False)
            self.menu.entryconfig(1, label='窗口置顶')
        else:
            self.attributes('-topmost', True)
            self.menu.entryconfig(1, label='取消置顶')
        self.set_value_to_registry('topmost', '1' if self.attributes('-topmost') else None)

    # 改变背景色
    def choose_color(self):
        color = askcolor()[1]
        if color:
            self.config(bg=color)
            self.datetime_label.config(bg=color)
            self.note_label.config(bg=color)
            self.text_label.config(bg=color)
            self.set_value_to_registry('background_color', color)

    # 锁定
    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 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)
        self.set_value_to_registry('lock', '1' if self.locked else None)
        # self.set_value_to_registry('winfo_screenwidth', self.winfo_x() - self.mouse_x)


    # 显示右键菜单
    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)

    # 更新txt文档内容
    def update_text_label(self):
        now = ''
        if os.path.exists('config.txt'):
            now = open('config.txt', 'r', encoding='utf8').read().strip()
        now = now or self.get_value_from_registry('text_label', '小锋学长生活大爆炸')
        if now:
            self.text_label.configure(text=now)
        # self.after(1000, self.update_text_label)

    def edit_text_labele(self):
        """打开文本输入框并更新内容"""
        # 创建文本输入框并显示默认内容
        note = tkinter.simpledialog.askstring('修改Note', '请输入新的note', initialvalue=self.text_label['text'], parent=self)
        # 如果用户点击确认,则更新文本标签的内容
        if note:
            self.text_label['text'] = note
            self.set_value_to_registry('text_label', note)

    # 更新周次
    def update_note_label(self):
        # 指定日期,格式为 年-月-日
        start_y, start_m, start_d = list(map(int, self.start_date.strip().split('/')))
        end_y, end_m, end_d = list(map(int, self.end_date.strip().split('/')))
        specified_start_date = datetime.date(start_y, start_m, start_d)
        specified_end_date = datetime.date(end_y, end_m, end_d)
        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 on_left_button_down(self, event):
        self.mouse_x = event.x
        self.mouse_y = event.y

    # 实现窗口拖动
    def on_left_button_up(self, event):
        x = self.winfo_x() + event.x - self.mouse_x
        y = self.winfo_y() + event.y - self.mouse_y
        self.mouse_x = 0
        self.mouse_y = 0
        self.set_value_to_registry('win_x', str(x))
        self.set_value_to_registry('win_y', str(y))

    # 实现窗口拖动
    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()


效果

【教程】使用ChatGPT制作基于Tkinter的桌面时钟

界面上鼠标点击右键可以选择“退出”:

【教程】使用ChatGPT制作基于Tkinter的桌面时钟


鼠标移动到界面,会显示“锁定”和“解除锁定”按钮:

【教程】使用ChatGPT制作基于Tkinter的桌面时钟

说明

        关于背景颜色、日期等等内容,大家可以修改相应的代码。

下载

https://xfxuezhang.lanzouo.com/b09ubrasb
密码:c9o1文章来源地址https://www.toymoban.com/news/detail-469287.html

到了这里,关于【教程】使用ChatGPT制作基于Tkinter的桌面时钟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python入门学习之小工具制作系列--02使用tkinter库写一个BMI身体指数检测小程序

    一、小程序检测功能逻辑 即通过输入身高、体重两个数据即可计算自己的BMI身体指数是多少,且对身体状况做相应提醒。 二、小程序使用体验 1,弹出主界面,输入身高,体重数据~ 2,点击计算,输出BMI数据~ 3,根据BMI结果,给出相应的建议~ 三、小程序代码逻辑 1,引入t

    2024年02月15日
    浏览(51)
  • 【新手教程】如何在Win11上制作一个模仿MacOS的桌面?

    起因是早上蹲坑的时候偶然间在小红书上刷到一篇文章,看了下效果图感觉还不错,所以按照文章作者的流程来了一遍。过程中也遇到了一些小问题,正好放假了有空就写一篇文章记录一下。先放一下效果: Dock栏是啥玩意?作为一个不熟悉苹果操作系统的用户,没见过这个

    2024年02月06日
    浏览(25)
  • 基于RASC的keil电子时钟制作(瑞萨RA)(6)----定时器驱动数码管

    要想让每个数码管显示不同的数字,但是数码管必须依次地被持续驱动,数码管之间的刷新速度应该足够快,这样就看不出来数码管之间在闪烁。刷新频率可以设置为2ms刷新一次,这样人眼就看不出闪烁了。 首先需要准备一个开发板,这里我准备的是芯片型号R7FA2E1A72DFL的开

    2024年02月15日
    浏览(29)
  • tkinter 的界面美化库:ttkbootstrap 使用教程

    嗨害大家好鸭!我是芝士❤ tkbootstrap 是一个基于 tkinter 的界面美化库, 使用这个工具可以开发出类似前端 bootstrap 风格的 kinter 桌面程序。 如果会 tkinter 学习起来就会非常简单, 如果不会的话只要先花两三天的时间系统学习一下 tkinter 之后再来使用 bootstrap 也是一样。 ttkb

    2024年02月07日
    浏览(29)
  • (三)Python-tkinter桌面应用(爱心雨)

    我们已经了解到tkinter可以制作爱心,弹幕,为了能让他看起来更加的充满心意,于是,我们决定将他制作为爱心雨。让它看起来更加的特别,达到特别的需求。 (一)Python-tkinter桌面应用开发(多弹窗) (二)Python-tkinter桌面应用(桌面上的弹幕) 我们要让我们的爱心移动

    2023年04月20日
    浏览(69)
  • stm32使用四位数码管制作简易时钟(库函数版)

    1.数码管情况介绍 数码管接线引脚:    段码与上图情况,位选为:1-PB0,2-PB12,3-PB13,4-PB14。 本项目使用5461BS-1共四位数码管,为共阳型。  2.程序部分 Timer定时器: SMG数码管 main主函数 资料参考: (75条消息) STM32F103C8T6 I/O口驱动4位共阳数码管_io口控制数码管_seaup2011的博客-CSDN博

    2024年02月08日
    浏览(34)
  • 【保姆级教程】如何用Rust编写一个ChatGPT桌面应用

    原因实在太多,我们需要便捷地导出记录,需要在回答长度超长的时候自动加上“继续”,需要收藏一些很酷很实用的prompt...... (首先我假设你是一名如我一样习惯用IDEA开发的java仔) 效率高、资源占用量低。 安全性高:Rust 是一种内存安全的语言,其所有操作都经过系统级

    2024年02月04日
    浏览(33)
  • 从零开始制作一个基于STM32和ESP8266-01S的智能时钟(3)ESP8266-01S模块(上)

    提示:这里可以添加本文要记录的大概内容:之前在忙着,现在继续补充完整,然后这次的ESP-01S的典型应用图是没有连接RST引脚的,但是我的项目是用到了RST引脚的,所以需要使用跳线连接一下RST引脚。 本项目需要基础的stm32单片机知识,这里我推荐 链接:https://www.bilibil

    2024年02月03日
    浏览(38)
  • Python tkinter 制作文章搜索软件

    今天,我无聊的时候做了一个搜索文章的软件,有没有更加的方便快捷不知道,好玩就行了。基于Python tkinter 制作文章搜索软件,都是一些基础的应用。🍖 🍗 🥩 代码 我们首先做到第一件事是导入模块。 代码 这段代码创建了一个名为 root 的Tkinter窗口对象,并设置了窗口的

    2023年04月08日
    浏览(28)
  • tkinter制作一个简单计算器

            我们知道tkinter是python常用的UI框架,那么它是如何使用的呢?我们用一个简单的例子来显示它的作用,制作一个简单的计算器,如下图所示。 上图是一个计算器,我们可以看出它一共有20个键,每个按键都表示一个功能,在最上方是一个文本框用来显示数值。接下

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包