这个问题只发生在RPi(3B+,Raspbian Buster)上。我在Mac上运行该程序没有任何问题。
我的程序的简短描述。
在进入mainloop后,当指定的按钮被按下时,程序会进入另一个循环的线程(称之为requestloop)。再次按下按钮就可以离开requestloop。这个requestloop每隔10秒通过url请求一个xml表,然后用ElementTree解析,排序并显示在wx.grid.Grid中。我使用grid.ForceRefresh来确保网格被更新。
我希望下面的片段能帮助理解上述内容。
def on_btnrun(self, event):
global run
if self.btnrun.Label == "Start":
run = True
thrupt = threading.Thread(target=self.thrupdate)
thrupt.start()
self.btnrun.SetLabel("Ende")
elif self.btnrun.Label == "Ende":
run = False
self.btnrun.SetLabel("Start")
def thrupdate(self):
while run is True:
reset()
self.grid.ClearGrid()
update(self.grid)
self.grid.ForceRefresh()
time.sleep(10)
问题。
现在就像标题中提到的那样,整个wx窗口在通过requestloop大约5到20次之后就冻结了。这完全是随机发生的,我找不到任何规律。当我现在打开另一个窗口(例如菜单下拉),在wx窗口上,它将被复制到wx窗口上,并在我关闭它后留在那里。
这里有一些图片可以让你更好的理解我的意思(忽略所有其他我没有提到的小部件,它们只是一些无功能的占位符)。
额外信息: 在RPi上构建wxPython时,我得到了一些警告,每次运行程序时都会得到以下警告(它说的是实际时间而不是时间)。
(program.py:1666): Gtk-Critical **: time: gtk_distribute_natural_allocation: assertion ‚extra_space >= 0‘ failed
问题:我不知道为什么会发生这种情况。
我不知道为什么会发生这样的情况,是不是wxPython不稳定?是wxPython在Raspbian上不稳定吗?还是部分编译失败了?还是RPi的渲染能力不够?
通过在update()方法的细节中使用wx.CallAfter来解决。