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
相关产品推荐
相关产品推荐

