本人作为编程小白,此前连基本程序都难以读懂。听闻 AI 大模型可辅助编程后,展开了一系列测试,本次是继前几次测试后的又一次编程测试。
在此次测试中,借助了腾讯元宝AI大模型,通过多次重复提问,成功编写出一个桌面小工具的 Python 程序,并将其打包成可执行文件 exe,整个过程耗时 70 分钟。
同时,还准备了做好后的可执行文件演示视频以及 Python 程序部分截图。
文件截图:
演示视频:
Python程序部分截图:
在利用 AI 大模型编程的过程中,总结出以下几点关键经验:
1.提问策略:验证和提问方式极为关键。采用合理的递进式提问,能够实现逐层深入。首要的是先开启编程任务,后续在验证阶段通过持续提问来完善程序。这种步步深入的提问模式,能有效引导 AI 给出更贴合需求的代码。
2.基础知识储备:即便不懂编程,对一些基本逻辑和运行原理有所了解会更有利。当然,若缺乏相关知识,也可参考 AI 每次回答中的注意事项。将这些建议融入后续问题中,有助于完善程序功能,不过这可能会花费更多时间。
3.学习模式:边问边验证的模式,极大地完善了我对程序逻辑的认知。这种模式仿佛身边有一位经验丰富的老师,随时等待提问并耐心解答,非常适合编程学习。它不仅能帮助完成编程任务,还能在过程中逐步构建起编程思维和知识体系。
以下是使用AI大模型进行的整个提问过程:为方便大家观看,前面仅体现提问的方式,不展现未完善的程序,最终完善的程序在最后一次问答中。
用户提问1:
使用python生成一个程序:GUI上显示闹钟按钮,点击后在桌面显示一个灰色透明的时间GUI上显示壁纸切换按钮,也可以上传壁纸,自动或手动切换壁纸GUI上显示计算器按钮,点击后,调用电脑计算器
用户提问2:
自动切换壁纸的时间间隔可以根据需要调整 time.sleep(60) 中的数值。闹钟按钮点击后显示,再次点击关闭。显示模式和关闭模式用不同的颜色显示。同时,闹钟显示界面可以用鼠标拖动位置
用户提问3:
可以选择闹钟颜色和透明度
用户提问4:
保留选择闹钟颜色和调整透明度的功能,同时可以拖动闹钟边框一角,放大显示闹钟,时间字体同时放大并自动居中显示
用户提问5:
设置颜色和透明度的按钮显示在GUI上,不要显示在闹钟界面上
用户提问6:
手动切换壁纸可以选择上一个和下一个,自动切换壁纸可以选择间隔时间
用户提问7:
自动切换壁纸的时间间隔可以根据用户输入进行调整。自动切换壁纸按钮,按下开启,再次点击关闭,有颜色区别。另外,整个GUI的美观度提升以下,布局合理
用户提问8:
增加截图功能和按钮,调用系统的截图功能,把上述程序的GUI界面分区,闹钟、壁纸、计算机、截图分为四个功能区
回答:
为了将上述程序的 GUI 界面分区,把闹钟、壁纸、计算器、截图分为四个功能区,可以使用 tkinter 的 Frame 组件来实现。Frame 就像是一个容器,可以将相关的组件组合在一起,形成不同的功能区域。
以下是修改后的代码:
import tkinter as tkfrom tkinter import filedialog, messagebox, colorchooserimport timeimport osimport ctypesimport threadingfrom datetime import datetimeimport platformimport subprocess# 全局变量,用于记录闹钟窗口状态alarm_window = Noneis_alarm_shown = Falsestop_auto_change = threading.Event() # 用于控制自动切换壁纸的线程# 显示或隐藏闹钟时间的窗口def toggle_alarm_time(): global alarm_window, is_alarm_shown if is_alarm_shown: alarm_window.destroy() alarm_button.config(bg='SystemButtonFace') # 恢复按钮默认颜色 is_alarm_shown = False else: alarm_window = tk.Toplevel() alarm_window.attributes('-alpha', alarm_alpha) # 设置窗口透明度 alarm_window.configure(bg=alarm_color) # 设置窗口背景颜色 alarm_window.overrideredirect(True) # 去除窗口边框 alarm_label = tk.Label(alarm_window, font=('Arial', 24), bg=alarm_color, fg='white') alarm_label.pack(padx=20, pady=20) def update_time(): current_time = datetime.now().strftime('%H:%M:%S') alarm_label.config(text=current_time) alarm_window.after(1000, update_time) update_time() # 计算窗口应该显示的位置,这里简单设置在桌面左上角 alarm_window.geometry("+0+0") # 鼠标拖动功能 def start_drag(event): alarm_window.x = event.x alarm_window.y = event.y def drag(event): deltax = event.x - alarm_window.x deltay = event.y - alarm_window.y x = alarm_window.winfo_x() + deltax y = alarm_window.winfo_y() + deltay alarm_window.geometry(f"+{x}+{y}") alarm_window.bind("<ButtonPress-1>", start_drag) alarm_window.bind("<B1-Motion>", drag) alarm_button.config(bg='green') # 改变按钮颜色表示已显示 is_alarm_shown = True# 壁纸切换功能wallpaper_files = []current_wallpaper_index = 0auto_change_thread = Noneis_auto_changing = Falsedef upload_wallpaper(): global wallpaper_files file_paths = filedialog.askopenfilenames(filetypes=[("Image files", "*.png;*.jpg;*.jpeg")]) if file_paths: wallpaper_files.extend(file_paths) messagebox.showinfo("Success", "Wallpapers uploaded successfully!")def change_wallpaper_prev(): global current_wallpaper_index if wallpaper_files: current_wallpaper_index = (current_wallpaper_index - 1) % len(wallpaper_files) set_wallpaper(wallpaper_files[current_wallpaper_index])def change_wallpaper_next(): global current_wallpaper_index if wallpaper_files: current_wallpaper_index = (current_wallpaper_index + 1) % len(wallpaper_files) set_wallpaper(wallpaper_files[current_wallpaper_index])def set_wallpaper(path): try: SPI_SETDESKWALLPAPER = 20 ctypes.windll.user32.SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, path, 3) except Exception as e: messagebox.showerror("Error", f"Failed to set wallpaper: {e}")def change_wallpaper_auto(): global auto_change_thread, is_auto_changing if is_auto_changing: is_auto_changing = False stop_auto_change.set() # 标记停止线程 auto_change_button.config(bg='SystemButtonFace') # 恢复按钮默认颜色 if auto_change_thread: auto_change_thread.join() # 等待线程结束 else: def auto_change(): global current_wallpaper_index stop_auto_change.clear() # 清除停止标记 while not stop_auto_change.is_set(): if wallpaper_files: current_wallpaper_index = (current_wallpaper_index + 1) % len(wallpaper_files) set_wallpaper(wallpaper_files[current_wallpaper_index]) try: time.sleep(int(interval_entry.get())) # 根据输入的间隔时间切换壁纸 except ValueError: messagebox.showerror("Error", "Please enter a valid number for interval.") break is_auto_changing = True auto_change_button.config(bg='green') # 改变按钮颜色表示正在自动切换 auto_change_thread = threading.Thread(target=auto_change, daemon=True) auto_change_thread.start()# 调用电脑计算器def open_calculator(): if os.name == 'nt': # 检查是否为 Windows 系统 os.system('calc.exe')# 调用系统截图功能def take_screenshot(): system = platform.system() if system == "Windows": try: subprocess.Popen('snippingtool') except Exception as e: messagebox.showerror("Error", f"Failed to open snipping tool: {e}") elif system == "Darwin": # macOS try: subprocess.Popen(['screencapture', '-i']) except Exception as e: messagebox.showerror("Error", f"Failed to open screenshot tool: {e}") else: messagebox.showwarning("Unsupported", "Screenshot function is not supported on this system.")# 闹钟颜色和透明度设置alarm_color = 'gray'alarm_alpha = 0.5def set_alarm_color(): global alarm_color color = colorchooser.askcolor()[1] if color: alarm_color = color if alarm_window: alarm_window.configure(bg=alarm_color) for child in alarm_window.winfo_children(): if isinstance(child, tk.Label): child.configure(bg=alarm_color)def set_alarm_alpha(): global alarm_alpha try: alpha = float(alpha_entry.get()) if 0 <= alpha <= 1: alarm_alpha = alpha if alarm_window: alarm_window.attributes('-alpha', alarm_alpha) else: messagebox.showerror("Error", "Opacity value must be between 0 and 1.") except ValueError: messagebox.showerror("Error", "Please enter a valid number for opacity.")# 创建主 GUI 窗口root = tk.Tk()root.title(" 多功能程序")root.geometry("400x500") # 设置窗口大小root.configure(bg="#f0f0f0") # 设置窗口背景颜色# 闹钟功能区alarm_frame = tk.Frame(root, bg="#f0f0f0", bd=2, relief=tk.GROOVE)alarm_frame.pack(pady=10, padx=10, fill=tk.X)alarm_button = tk.Button(alarm_frame, text="闹钟", command=toggle_alarm_time, bg="#e0e0e0", font=("Arial", 12))alarm_button.pack(side=tk.LEFT, padx=5)color_button = tk.Button(alarm_frame, text="设置闹钟颜色", command=set_alarm_color, bg="#e0e0e0", font=("Arial", 12))color_button.pack(side=tk.LEFT, padx=5)alpha_label = tk.Label(alarm_frame, text="设置闹钟透明度 (0 - 1):", bg="#f0f0f0", font=("Arial", 12))alpha_label.pack(side=tk.LEFT, padx=5)alpha_entry = tk.Entry(alarm_frame, font=("Arial", 12))alpha_entry.insert(0, str(alarm_alpha))alpha_entry.pack(side=tk.LEFT, padx=5)alpha_set_button = tk.Button(alarm_frame, text="应用透明度", command=set_alarm_alpha, bg="#e0e0e0", font=("Arial", 12))alpha_set_button.pack(side=tk.LEFT, padx=5)# 壁纸功能区wallpaper_frame = tk.Frame(root, bg="#f0f0f0", bd=2, relief=tk.GROOVE)wallpaper_frame.pack(pady=10, padx=10, fill=tk.X)upload_button = tk.Button(wallpaper_frame, text="上传壁纸", command=upload_wallpaper, bg="#e0e0e0", font=("Arial", 12))upload_button.pack(side=tk.LEFT, padx=5)prev_button = tk.Button(wallpaper_frame, text="上一张壁纸", command=change_wallpaper_prev, bg="#e0e0e0", font=("Arial", 12))prev_button.pack(side=tk.LEFT, padx=5)next_button = tk.Button(wallpaper_frame, text="下一张壁纸", command=change_wallpaper_next, bg="#e0e0e0", font=("Arial", 12))next_button.pack(side=tk.LEFT, padx=5)interval_label = tk.Label(wallpaper_frame, text="自动切换间隔时间 (秒):", bg="#f0f0f0", font=("Arial", 12))interval_label.pack(side=tk.LEFT, padx=5)interval_entry = tk.Entry(wallpaper_frame, font=("Arial", 12))interval_entry.insert(0, "60")interval_entry.pack(side=tk.LEFT, padx=5)auto_change_button = tk.Button(wallpaper_frame, text="自动切换壁纸", command=change_wallpaper_auto, bg="#e0e0e0", font=("Arial", 12))auto_change_button.pack(side=tk.LEFT, padx=5)# 计算器功能区calculator_frame = tk.Frame(root, bg="#f0f0f0", bd=2, relief=tk.GROOVE)calculator_frame.pack(pady=10, padx=10, fill=tk.X)calculator_button = tk.Button(calculator_frame, text="计算器", command=open_calculator, bg="#e0e0e0", font=("Arial", 12))calculator_button.pack(side=tk.LEFT, padx=5)# 截图功能区screenshot_frame = tk.Frame(root, bg="#f0f0f0", bd=2, relief=tk.GROOVE)screenshot_frame.pack(pady=10, padx=10, fill=tk.X)screenshot_button = tk.Button(screenshot_frame, text="截图", command=take_screenshot, bg="#e0e0e0", font=("Arial", 12))screenshot_button.pack(side=tk.LEFT, padx=5)# 运行主循环root.mainloop()
代码说明:
创建功能区 Frame:
使用 tk.Frame 创建四个不同的功能区,分别为 alarm_frame、wallpaper_frame、calculator_frame 和 screenshot_frame。每个 Frame 都设置了边框(bd=2)和浮雕样式(relief=tk.GROOVE),以便在界面上区分不同的功能区。
将组件放入功能区:
将与每个功能相关的按钮、标签和输入框等组件放入对应的 Frame 中,使用 pack 布局管理器进行布局。
布局功能区:
使用 pack 方法将四个功能区依次排列在主窗口中,设置了一定的内边距(pady 和 padx),使界面更加美观。
通过这种方式,界面被清晰地划分为四个功能区,每个功能区的组件都被组织在一起,提高了界面的可读性和可维护性。
领取专属 10元无门槛券
私享最新 技术干货