You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WxPython实现BLE应用闪烁LED指示及LED阵列方案咨询

嘿,很高兴能帮到你!针对你在WxPython里实现BLE状态指示LED的需求,我整理了两个核心场景的代码示例,直接就能复用或者参考调整~

单个蓝色闪烁LED(BLE连接状态指示)

我这里用自定义wx.Panel模拟LED,结合wx.Timer实现闪烁逻辑,你只需要在BLE连接/断开的回调里切换LED状态就行:

import wx

class BLEStatusLED(wx.Panel):
    def __init__(self, parent, size=(20,20)):
        super().__init__(parent, size=size)
        self.SetBackgroundStyle(wx.BG_STYLE_PAINT)
        self.is_connected = False
        self.is_blinking = False
        self.blink_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.on_blink, self.blink_timer)
        self.Bind(wx.EVT_PAINT, self.on_paint)

    def on_paint(self, event):
        dc = wx.PaintDC(self)
        dc.SetBackground(wx.Brush(wx.Colour(30,30,30)))  # 深色背景模拟LED底座
        dc.Clear()
        
        # 根据连接状态切换LED颜色
        if self.is_connected:
            led_color = wx.Colour(0, 150, 255) if self.is_blinking else wx.Colour(0, 50, 100)
        else:
            led_color = wx.Colour(50,50,50)  # 未连接时显示灰色
        
        # 绘制圆形LED
        dc.SetBrush(wx.Brush(led_color))
        dc.SetPen(wx.Pen(wx.Colour(100,100,100)))
        dc.DrawCircle(self.GetSize()[0]//2, self.GetSize()[1]//2, min(self.GetSize())//2 - 2)

    def on_blink(self, event):
        self.is_blinking = not self.is_blinking
        self.Refresh()

    def set_connected(self, connected):
        self.is_connected = connected
        if connected:
            self.blink_timer.Start(500)  # 500ms间隔闪烁
        else:
            self.blink_timer.Stop()
            self.is_blinking = False
        self.Refresh()

# 主窗口示例,模拟BLE连接触发
class MainFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title="BLE状态指示", size=(300,200))
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)
        
        self.led = BLEStatusLED(panel)
        vbox.Add(self.led, flag=wx.CENTER|wx.TOP, border=50)
        
        # 模拟BLE连接开关按钮
        connect_btn = wx.Button(panel, label="模拟BLE连接")
        connect_btn.Bind(wx.EVT_BUTTON, self.on_toggle_connection)
        vbox.Add(connect_btn, flag=wx.CENTER|wx.TOP, border=20)
        
        panel.SetSizer(vbox)
        self.connected = False

    def on_toggle_connection(self, event):
        self.connected = not self.connected
        self.led.set_connected(self.connected)
        btn = event.GetEventObject()
        btn.SetLabel("断开BLE连接" if self.connected else "模拟BLE连接")

if __name__ == "__main__":
    app = wx.App()
    frame = MainFrame()
    frame.Show()
    app.MainLoop()

使用时,你只需要在你的BLE库连接成功/断开的回调里,调用self.led.set_connected(True/False)即可。如果BLE回调是在非UI线程执行的,记得用wx.CallAfter包裹,避免线程安全问题:

# 比如BLE连接成功的异步回调
def ble_connect_success(self):
    wx.CallAfter(self.led.set_connected, True)
状态指示闪烁LED阵列

如果需要多个LED对应不同BLE状态(比如连接中、已连接、数据传输、错误),可以把单个LED组件组合起来,每个LED独立控制闪烁频率和颜色:

import wx

class StatusLED(wx.Panel):
    def __init__(self, parent, color_on, color_off, size=(20,20)):
        super().__init__(parent, size=size)
        self.SetBackgroundStyle(wx.BG_STYLE_PAINT)
        self.color_on = color_on
        self.color_off = color_off
        self.is_active = False
        self.is_blinking = False
        self.blink_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.on_blink, self.blink_timer)
        self.Bind(wx.EVT_PAINT, self.on_paint)

    def on_paint(self, event):
        dc = wx.PaintDC(self)
        dc.SetBackground(wx.Brush(wx.Colour(30,30,30)))
        dc.Clear()
        
        if self.is_active:
            led_color = self.color_on if self.is_blinking else self.color_off
        else:
            led_color = wx.Colour(50,50,50)
        
        dc.SetBrush(wx.Brush(led_color))
        dc.SetPen(wx.Pen(wx.Colour(100,100,100)))
        dc.DrawCircle(self.GetSize()[0]//2, self.GetSize()[1]//2, min(self.GetSize())//2 - 2)

    def on_blink(self, event):
        self.is_blinking = not self.is_blinking
        self.Refresh()

    def activate(self, blink_interval=None):
        self.is_active = True
        if blink_interval is not None:
            self.blink_timer.Start(blink_interval)
        else:
            self.blink_timer.Stop()
            self.is_blinking = True  # 常亮状态
        self.Refresh()

    def deactivate(self):
        self.is_active = False
        self.blink_timer.Stop()
        self.is_blinking = False
        self.Refresh()

# LED阵列主窗口
class LEDArrayFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title="BLE状态LED阵列", size=(400,200))
        panel = wx.Panel(self)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        
        # 定义不同状态的LED
        self.leds = {
            "connecting": StatusLED(panel, wx.Colour(255,165,0), wx.Colour(100,60,0)),  # 橙色慢闪(连接中)
            "connected": StatusLED(panel, wx.Colour(0,255,0), wx.Colour(0,100,0)),      # 绿色常亮(已连接)
            "transmitting": StatusLED(panel, wx.Colour(0,150,255), wx.Colour(0,50,100)),# 蓝色快闪(传输中)
            "error": StatusLED(panel, wx.Colour(255,0,0), wx.Colour(100,0,0))           # 红色中闪(错误)
        }
        
        # 添加LED和对应标签
        for name, led in self.leds.items():
            vbox = wx.BoxSizer(wx.VERTICAL)
            vbox.Add(led, flag=wx.CENTER)
            label = wx.StaticText(panel, label=name.replace("_", " ").title())
            vbox.Add(label, flag=wx.CENTER|wx.TOP, border=5)
            hbox.Add(vbox, flag=wx.CENTER|wx.LEFT|wx.RIGHT, border=20)
        
        # 模拟状态切换按钮
        btn_box = wx.BoxSizer(wx.HORIZONTAL)
        states = ["connecting", "connected", "transmitting", "error", "all_off"]
        for state in states:
            btn = wx.Button(panel, label=state.replace("_", " ").title())
            btn.Bind(wx.EVT_BUTTON, lambda e, s=state: self.set_state(s))
            btn_box.Add(btn, flag=wx.LEFT|wx.RIGHT, border=5)
        
        hbox.Add(btn_box, flag=wx.CENTER|wx.TOP, border=30)
        panel.SetSizer(hbox)

    def set_state(self, state):
        # 先关闭所有LED
        for led in self.leds.values():
            led.deactivate()
        
        if state == "all_off":
            return
        
        if state == "connecting":
            self.leds["connecting"].activate(700)
        elif state == "connected":
            self.leds["connected"].activate()
        elif state == "transmitting":
            self.leds["transmitting"].activate(300)
        elif state == "error":
            self.leds["error"].activate(500)

if __name__ == "__main__":
    app = wx.App()
    frame = LEDArrayFrame()
    frame.Show()
    app.MainLoop()

你可以根据实际需求调整LED的颜色、大小、闪烁间隔,甚至把圆形改成方形,或者添加多层光晕效果提升视觉体验。

内容的提问来源于stack exchange,提问作者schanti schul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:26:14