Bootstrap

杨圣洲:解析基于Python GUI的信息自动化程序的构建原理与实现细节

作者:杨圣洲   2024年7月23日


在人工智能得到爆炸式发展的今天,自动化工具在提高工作效率方面发挥着重要作用。本文将探讨我的“WX自动化”的Python GUI应用程序,该程序能够实现消息的自动化,包括定时和随机功能。

前言

首先老规矩,先附上程序和程序使用教程。

自动化v2.4程序下载icon-default.png?t=N7T8https://cca4666.lanzoul.com/iE5nU256jvrg

程序使用教程icon-default.png?t=N7T8https://www.bilibili.com/video/BV1kA81eYEh1/?share_source=copy_web&vd_source=f4167f5d5733b1b3cbdcbb4f2caa2211        警告:以下涉及到软件源代码,修改或使用本产品源代码,一切后果将由您自行承担,包括但不限于法律责任、技术风险及数据丢失等严重后果。


技术栈

  • Python: 主要编程语言。
  • Tkinter: 用于构建GUI。
  • threading: 用于多线程操作。
  • time, datetime: 用于处理时间相关功能。
  • random: 用于生成随机数。
  • wxauto: 第三方库,用于操作微信客户端。
  • tkcalendar: 提供日期选择功能。

功能概览

1. 消息发送
用户可以通过设置接收者、消息内容、发送间隔和数量,实现消息的连续发送。

2. 定时发送
用户可以指定日期和时间,程序将在预定时间自动发送消息。

3. 日志记录
所有操作都会被记录在日志中,方便用户追踪。

4. 多线程控制
程序在后台执行发送任务,不影响主界面的交互。


核心源代码原理分析

在所有实现的源代码中,最核心且技术含量较高的部分是“定时发送逻辑”。这部分不仅涉及到用户界面的交互,还涉及到后台任务的调度和时间计算。我将对这部分代码的详细分析:

定时发送逻辑

def schedule_send(self):
    if not self.is_sending:
        self.is_scheduled = True
        self.disable_start_button()
        self.enable_pause_stop_buttons()
        receiver = self.receiver_entry.get()
        message = self.message_entry.get("1.0", tk.END).strip()
        selected_date = self.date_picker.get_date()
        selected_time = self.time_picker.get()
        count = self.count_var.get()

        try:
            scheduled_datetime = datetime.datetime.combine(selected_date,
                                                           datetime.datetime.strptime(selected_time, "%H:%M").time())

            if scheduled_datetime <= datetime.datetime.now():
                self.log("时间异常,请选择未来的时间", "error")
                # 重置 is_scheduled 在定时设置失败时
                self.is_scheduled = False
                self.enable_schedule_button()
                self.enable_start_button()
                self.disable_pause_stop_buttons()
                return

            self.log(f"{count}条'{message}' 将在 {scheduled_datetime} 发送给 {receiver}", "warning")

            # 设置定时任务前先禁用定时按钮
            self.disable_schedule_button()

            # 开始定时器,在预定的时间发送消息
            delay = (scheduled_datetime - datetime.datetime.now()).total_seconds()
            threading.Timer(delay, self.send_messages).start()

        except Exception as e:
            # 记录错误并重新启用调度按钮,同时重置 is_scheduled
            self.log(f"定时发送设置失败: {str(e)}", "error")
            self.is_scheduled = False
            self.enable_schedule_button()
```

详细分析

1. 状态管理:

self.is_scheduled` 标志位用于判断是否已经设置了定时任务。

self.disable_start_button() 和 `self.enable_pause_stop_buttons()` 用于更新界面按钮的状态,确保用户在设置定时任务时不能重复设置。

2. 用户输入获取

- 通过 `self.receiver_entry.get()`, `self.message_entry.get()`, `self.date_picker.get_date()`, 和 `self.time_picker.get()` 获取用户设置的接收者、消息内容、日期和时间。

3. **时间计算**:

 - 使用 `datetime.datetime.combine` 和 `datetime.datetime.strptime` 将用户选择的日期和时间合并成 `scheduled_datetime` 对象。
   - 检查 `scheduled_datetime` 是否在当前时间之后,如果不是,则提示用户选择未来的时间,并重置相关状态。

4. **日志记录**:

- 使用 `self.log()` 方法记录定时任务的设置情况,包括消息数量、内容、发送时间和接收者。

5. **定时任务调度**:

   - `self.disable_schedule_button()` 禁用定时按钮,防止用户重复设置。
   - 计算当前时间与预定时间的差值 `delay`,并将其转换为秒。
   - 使用 `threading.Timer` 创建一个定时器,当 `delay` 时间过后,调用 `self.send_messages()` 方法执行消息发送。

6. **异常处理**:

使用 `try-except` 结构捕获并处理可能发生的异常,例如日期时间格式错误等。
- 如果发生异常,记录错误日志,并重置定时任务状态,同时启用定时按钮。

这些核心源代码是程序的复杂性,涉及到多线程、时间计算、异常处理和用户界面状态管理等多个方面。


其他代码片段

初始化GUI应用程序

class WeChatMessengerApp:
    def __init__(self, root):
        # 初始化GUI组件和状态变量
        # ...
        self.root.title("佳声WX自动化 V2.4")
        self.root.geometry("1024x768")
        # ...

设置用户界面

def setup_tab1_ui(self):
    # 创建标签页1的UI组件
    # ...
    self.receiver_label = ttk.Label(top_frame, text="接收者:", font=label_font)
    # ...
    self.message_entry = tk.Text(message_frame, height=5, ...)
    # ...

定时发送功能

def schedule_send(self):
    # 设置定时任务
    # ...
    delay = (scheduled_datetime - datetime.datetime.now()).total_seconds()
    threading.Timer(delay, self.send_messages).start()

消息发送逻辑

def send_messages(self):
    # 发送消息的循环
    # ...
    for i in range(count):
        if self.stop_event.is_set():
            break
        try:
            wx.SendMsg(msg=message, who=receiver)
            self.log(f"第{i + 1}次发送 '{message}' 给 {receiver} 成功!", "success")
        except Exception as e:
            self.log(f"消息发送失败: {str(e)}", "error")
```

日志记录系统

def log(self, message, level="info"):
    # 记录日志信息
    # ...
    self.log_text.insert(tk.END, full_message + "\n", level)
    # ...
```

按钮状态控制

def enable_start_button(self):
    # 启用开始按钮
    self.start_button.config(state=tk.NORMAL)
    # ...

def disable_start_button(self):
    # 禁用开始按钮
    self.start_button.config(state=tk.DISABLED)
    # ...
```

安全与合规性

使用自动化工具时,需要确保不违反微信的使用条款和隐私政策。此外,自动化操作可能会受到平台的限制或封禁。

结语

微信自动化助手是一个功能强大的工具,能够帮助用户节省时间并提高沟通效率。然而,使用时应注意合法合规,并考虑到自动化操作可能带来的风险。


本文通过关键代码片段展示了微信自动化助手的主要功能和实现方式。希望读者能够通过本文对这款工具有一个全面的了解。请注意,实际部署和使用时,需要对代码进行适当的调整和测试,以确保其安全性和有效性。
 

;