使用Python和wxPython对RaspberryPi3进行不确定计时器调用

使用Python和wxPython对RaspberryPi3进行不确定计时器调用,wxpython,raspberry-pi3,python-3.7,Wxpython,Raspberry Pi3,Python 3.7,我使用Python3.7.2和WxPython4.0.4开发了一个简单的应用程序,它试图捕获按下连接到GPIO的real按钮的事件,然后通过串行端口运行一些RFID扫描仪。 此应用程序有两个wx.Timer——一个用于更新UI,第二个用于汇集按钮事件,然后定期启动扫描 虽然此应用程序可以在不同的PC上完美运行(如某些配备i3 CPU的笔记本电脑),但即使按钮连接到gpiozero和PigpiOfcory(远程GPIO),当从RaspberryPi启动时,计时器也不会同时运行。我在日志中看不到任何

我使用Python3.7.2和WxPython4.0.4开发了一个简单的应用程序,它试图捕获按下连接到GPIO的real按钮的事件,然后通过串行端口运行一些RFID扫描仪。 此应用程序有两个
wx.Timer
——一个用于更新UI,第二个用于汇集按钮事件,然后定期启动扫描

虽然此应用程序可以在不同的PC上完美运行(如某些配备i3 CPU的笔记本电脑),但即使按钮连接到
gpiozero
PigpiOfcory
(远程GPIO),当从RaspberryPi启动时,计时器也不会同时运行。我在日志中看不到任何错误或警告。无论什么定时器先启动,都不允许启动另一个定时器。 我从
wx.CallAfter()
开始,所以我不知道这是否与RaspberryPi的一个核心无关?我应该用什么方法来解决这个问题

[编辑] 代码的重要部分:

导入rfid\u帧
从gpiozero导入按钮
导入wx
类RfidFrame(rfid\u frame.main反帧):
定义初始化(自身,父级):
rfid\u frame.main counterframe.\uuuuu init\uuuuuu(自身,父对象)
自我展示(真实)
def绿色按钮保持()
全压框
如果按下:
打印(‘关闭’)
按下=错误
wx.CallAfter(停止计时器)
其他:
打印('ON')
按下=真
wx.CallAfter(启动计时器)
def启动计时器():
定时器扫描启动(2000)
def停止计时器():
计时器\u扫描停止()
def on_定时器_扫描(事件):
全局标记
frame.m_rfidCount.SetLabel(“{:d}”.format(tags))
def start_timer_ui():
定时器启动(1000)
计时器界面上的def(事件):
全局帧,bgcolor,fgcolor
帧m_rfidCount.setbackgroundcolor((bgcolor))
frame.m_rfidCount.setForeGroundColor((fgcolor))
def rfid_init():
全局按钮
按钮=按钮(4)
按钮。按下时=绿色按钮按下
def window_init():
全局应用程序、计时器界面、计时器扫描、帧
app=wx.app(假)
timer\u ui=wx.timer(应用程序)
定时器扫描=wx.定时器(应用程序)
timer\u ui\u id=timer\u ui.GetId()
timer\u scan\u id=timer\u scan.GetId()
app.Bind(wx.EVT\u TIMER、on\u TIMER\u ui、TIMER\u ui、TIMER\u id)
app.Bind(wx.EVT_TIMER、on_TIMER_scan、TIMER_scan、TIMER_scan_id)
wx.CallAfter(启动计时器用户界面)
帧=RfidFrame(无)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
窗口初始化()
app.MainLoop()
[编辑二]
正如评论中所建议的,我也使用了计时器ID。但仍然存在相同的问题。

您是否为每个计时器使用不同的ID?如果不显示,很难解释为什么您的代码会在RPi或任何其他体系结构上运行……代码是附加的。另外,
rfid\u框架
非常简单,只有
StaticText
和必需的容器(所有东西都是用wxFormBuilder制作的)。我想是关于ID的,但是为什么这个代码在普通PC上工作呢?Python/wxPython的相同版本。使用
virtualenv
中的
pyenv
pip freeze
安装的模块。如果说普通PC是指Windows,我认为您的(无意冒犯,但不正确)代码可以工作这一事实根本不能保证它可以在Linux上工作。有时候,在操作系统级别,情况非常不同。我建议你试着用身份证。是一个很好的资源,以防你需要一些指针。我不用窗户。我在Debian Buster上使用的PC与我在最新raspibian上使用的Python版本完全相同-安装有
pyenv virtualenv
-其他模块也一样。然后使用gitlab runner将代码部署到多个raspi设备上。所以,一切都在Linux上,只有架构不同。代码本身对覆盆子很好。如果我不使用计时器,但从主循环使用wx.CallAfter执行一些一次性调用-UI或GPIO事件以及与scanner的串行通信工作正常(虽然只有一次)。不知道,但取决于这些计时器的实现方式,架构上的差异(ARM与x86-64)可以解释这种差异。除了添加ID,我无法提供更多建议。如果您想知道需要深入研究代码的方式和原因,可能要一直深入到内核,如果您有时间,前面会有很多乐趣