作为一名程序员,常常会因为沉迷coding的世界而忘记喝水,早上接了一杯水,到下班还能剩下半杯,所以为了解决这个问题,我突发奇想,我要设计一个macOs端(因为公司用的mac)的 喝水提醒 工具,在设置好时间间隔之后,会按时弹出提示框来提醒我喝水。
因为我没有过开发过类似工具的经验,所以这次我把开发工作全权委托给腾讯云代码工具 codebuddy,来实现。我们在一些常见的主流编辑器,例如在IDEA、Vscode中的插件中心都可以安装 codebuddy,安装之后就可以开始开发工作。
在 codebuddy 中,我们只需要关注他的两个功能。
我将需求输入到codebuddy,codebuddy列出了几个核心需求:
技术选型时我考虑了几个方案:单纯用Tkinter、PyQt或wxPython实现整个应用,或者用系统通知API。但这些方案要么界面太原始,要么定制性不够强。我将需求输入到codebuddy之后,codebuddy 最终决定采用混合架构:
我通过接入chat来询问codebuddy如何接入macos通知。
codebuddy也给出了技术方案,然后我使用craft来生成响应的代码。
接着就是让codebuddy帮我们生成代码。
首先,我们把我们的需求告诉codebuddy的craft。craft会自动将我的需求拆分,然后帮我生成对应的代码文件。
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分为三个区域:
# 间隔设置区域
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)
# 提醒内容区域
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)
# 按钮区域
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在开发的时候分为几个关键部分:
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()
def stop_reminder(self):
self.is_running = False
self.start_btn.config(state=tk.NORMAL)
self.stop_btn.config(state=tk.DISABLED)
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)
def immediate_reminder(self):
message = self.message_var.get()
self.show_reminder(message)
第一次实现这部分时,codebuddy也是遇到了一些问题:
daemon=True
创建线程,确保主程序退出时线程也会退出。if self.is_running
检查,防止在睡眠期间用户停止了提醒。当然,在我将问题反馈之后,codebuddy进行了代码优化,解决了这部分的问题。
在页面的设计中,codebuddy用pywebview实现了更炫酷的HTML提醒:
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
p = multiprocessing.Process(target=self._popup_webview, args=(temp_html_path,))
p.start()
@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分钟,如图,在一分钟的的等待之后,成功触发:
可以看到codebuddy帮我们设计的一个动态的提醒页面效果。
使用codebuddy,我完成了提醒喝水小助手的开发工作,可以看到codebuddy可以在我们的提示词引导下,完成开发和设计工作。如果遇到问题或者需要优化的细节,可以反馈给codebuddy进行优化迭代,最后实现项目程序的开发。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。