前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >忘记喝水?我用codebuddy 打造了一款喝水提醒工具

忘记喝水?我用codebuddy 打造了一款喝水提醒工具

原创
作者头像
叫我阿柒啊
发布2025-06-05 16:40:52
发布2025-06-05 16:40:52
19720
代码可运行
举报
运行总次数:0
代码可运行

前言

作为一名程序员,常常会因为沉迷coding的世界而忘记喝水,早上接了一杯水,到下班还能剩下半杯,所以为了解决这个问题,我突发奇想,我要设计一个macOs端(因为公司用的mac)的 喝水提醒 工具,在设置好时间间隔之后,会按时弹出提示框来提醒我喝水。

codebuddy

因为我没有过开发过类似工具的经验,所以这次我把开发工作全权委托给腾讯云代码工具 codebuddy,来实现。我们在一些常见的主流编辑器,例如在IDEA、Vscode中的插件中心都可以安装 codebuddy,安装之后就可以开始开发工作。

在 codebuddy 中,我们只需要关注他的两个功能。

  1. craft:适合从0到1构建项目,是本次开发的主要生产力
  2. chat:适合技术问答,如果有拿不定主意的地方可以先chat一下

技术选型

我将需求输入到codebuddy,codebuddy列出了几个核心需求:

  • 可自定义提醒时间间隔
  • 可自定义提醒内容
  • 提醒界面要美观,最好有动画效果
  • 在macOS上流畅运行

技术选型时我考虑了几个方案:单纯用Tkinter、PyQt或wxPython实现整个应用,或者用系统通知API。但这些方案要么界面太原始,要么定制性不够强。我将需求输入到codebuddy之后,codebuddy 最终决定采用混合架构:

  • Tkinter:实现主设置界面,轻量且Python自带
  • pywebview:实现提醒弹窗,可用HTML/CSS/JS实现绚丽效果
  • 多进程:解决Tkinter和pywebview的线程冲突问题

我通过接入chat来询问codebuddy如何接入macos通知。

codebuddy也给出了技术方案,然后我使用craft来生成响应的代码。

代码实现

接着就是让codebuddy帮我们生成代码。

主界面实现

首先,我们把我们的需求告诉codebuddy的craft。craft会自动将我的需求拆分,然后帮我生成对应的代码文件。

主界面设计

代码语言:python
代码运行次数:0
运行
复制
class WaterReminderApp:
    def __init__(self, root):
        self.root = root
        self.root.title("喝水定时提醒")
        self.root.geometry("370x230")
        self.is_running = False
        self.timer_thread = None

设置界面部分,codebuddy 将UI分为三个区域:

1. 时间间隔区域
代码语言:python
代码运行次数:0
运行
复制
# 间隔设置区域
interval_frame = tk.Frame(main_frame)
interval_frame.pack(fill=tk.X, pady=5)
tk.Label(interval_frame, text="提醒间隔(分钟):").pack(side=tk.LEFT)
self.interval_var = tk.StringVar(value="60")
tk.Entry(interval_frame, textvariable=self.interval_var, width=10).pack(side=tk.LEFT)
2. 提醒内容区域
代码语言:python
代码运行次数:0
运行
复制
# 提醒内容区域
message_frame = tk.Frame(main_frame)
message_frame.pack(fill=tk.X, pady=5)
tk.Label(message_frame, text="提醒内容:").pack(side=tk.LEFT)
self.message_var = tk.StringVar(value="该喝水啦!")
tk.Entry(message_frame, textvariable=self.message_var, width=25).pack(side=tk.LEFT)

3. 控制按钮区域

代码语言:python
代码运行次数:0
运行
复制
# 按钮区域
btn_frame = tk.Frame(main_frame)
btn_frame.pack(pady=15)
self.start_btn = tk.Button(btn_frame, text="开始提醒", command=self.start_reminder)
self.start_btn.pack(side=tk.LEFT, padx=5)
self.stop_btn = tk.Button(btn_frame, text="停止提醒", command=self.stop_reminder, state=tk.DISABLED)
self.stop_btn.pack(side=tk.LEFT, padx=5)
self.immediate_btn = tk.Button(btn_frame, text="立即提醒", command=self.immediate_reminder)
self.immediate_btn.pack(side=tk.LEFT, padx=5)

这段代码看着简单,但是codebuddy刚开始使用了最简单的垂直堆叠布局(.pack()),结果界面不太好看,间距不均匀,对齐也有问题。后来codebuddy又用了嵌套Frame控制布局,问题才得到解决。

定时提醒

提醒功能是整个应用的核心,codebuddy在开发的时候分为几个关键部分:

1. 开始提醒
代码语言:python
代码运行次数:0
运行
复制
def start_reminder(self):
    try:
        interval = int(self.interval_var.get())
        if interval <= 0:
            raise ValueError
    except ValueError:
        tk.messagebox.showerror("输入错误", "请输入有效的正整数分钟数!")
        return
    
    self.is_running = True
    self.start_btn.config(state=tk.DISABLED)
    self.stop_btn.config(state=tk.NORMAL)
    self.timer_thread = threading.Thread(target=self.reminder_loop, daemon=True)
    self.timer_thread.start()
2. 停止提醒
代码语言:python
代码运行次数:0
运行
复制
def stop_reminder(self):
    self.is_running = False
    self.start_btn.config(state=tk.NORMAL)
    self.stop_btn.config(state=tk.DISABLED)
3. 定时循环
代码语言:python
代码运行次数:0
运行
复制
def reminder_loop(self):
    interval = int(self.interval_var.get()) * 60  # 转换为秒
    message = self.message_var.get()
    while self.is_running:
        time.sleep(interval)
        if self.is_running:  # 再次检查,防止在睡眠期间被停止
            self.show_reminder(message)
4. 立即提醒功能
代码语言:python
代码运行次数:0
运行
复制
def immediate_reminder(self):
    message = self.message_var.get()
    self.show_reminder(message)

第一次实现这部分时,codebuddy也是遇到了一些问题:

  1. 定时精度问题:一开始我用Python的schedule库实现定时,但发现在macOS睡眠唤醒后可能会漏掉提醒。改用简单的循环+sleep更可靠。
  2. 线程清理问题:我特意使用daemon=True创建线程,确保主程序退出时线程也会退出。
  3. 状态检查:注意到在sleep后还有一个if self.is_running检查,防止在睡眠期间用户停止了提醒。

当然,在我将问题反馈之后,codebuddy进行了代码优化,解决了这部分的问题。

动态提醒窗口

在页面的设计中,codebuddy用pywebview实现了更炫酷的HTML提醒:

  1. 首先是生成HTML内容并创建临时文件:
代码语言:python
代码运行次数:0
运行
复制
def show_html_reminder(self, message):
    html_content = f"""
    <html>
       <!-- HTML内容 -->
       <body>
           <h1>喝水提醒</h1>
           <p>{message}</p>
       </body>
    </html>
    """
    with tempfile.NamedTemporaryFile('w', delete=False, suffix='.html') as f:
        f.write(html_content)
        temp_html_path = f.name
  1. 然后用多进程打开webview窗口:
代码语言:python
代码运行次数:0
运行
复制
    p = multiprocessing.Process(target=self._popup_webview, args=(temp_html_path,))
    p.start()
  1. 在新进程中显示窗口:
代码语言:python
代码运行次数:0
运行
复制
@staticmethod
def _popup_webview(html_path):
    import webview
    class Api:
        def close(self):
            webview.windows[0].destroy()
    api = Api()
    webview.create_window('喝水提醒', html_path, width=500, height=380, 
                         frameless=True, js_api=api)
    webview.start()

如图,设置窗口如下:

在窗口的设计中,codebuddy也克服了下面的技术难点:

  1. HTML动态生成:每次提醒根据用户输入动态生成HTML。
  2. 临时文件处理:使用tempfile模块避免垃圾文件堆积。
  3. 多进程隔离:最初我用线程打开webview窗口,在macOS上报错,最后用多进程解决了这个问题,主界面和提醒窗口完全隔离。

测试

为了方便测试,我这里设置了一个立即提醒的按钮,来触发喝水提醒,如图:

在我点击了立即提醒之后,就会出现喝水提醒。那么我接着测试定时功能,这里为设置为1分钟,如图,在一分钟的的等待之后,成功触发:

可以看到codebuddy帮我们设计的一个动态的提醒页面效果。

结语

使用codebuddy,我完成了提醒喝水小助手的开发工作,可以看到codebuddy可以在我们的提示词引导下,完成开发和设计工作。如果遇到问题或者需要优化的细节,可以反馈给codebuddy进行优化迭代,最后实现项目程序的开发。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • codebuddy
    • 技术选型
  • 代码实现
    • 主界面实现
    • 主界面设计
      • 1. 时间间隔区域
      • 2. 提醒内容区域
    • 3. 控制按钮区域
    • 定时提醒
      • 1. 开始提醒
      • 2. 停止提醒
      • 3. 定时循环
      • 4. 立即提醒功能
    • 动态提醒窗口
  • 测试
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档