我正在Linux上使用wxPython挣扎。经过大量的时间和调查,我将程序减少到最低限度,向您显示我遇到的问题之一。我可以只使用一个由计时器更新的窗口中的仪表,将其简化为一个很小的代码示例。我的第一个问题是按钮的背景色应该快速更改,这导致了奇怪的内存错误。由于完整的应用程序非常复杂,因此我搜索了一个简单的示例-宾果游戏!这是简化的代码,可以在Windows上正常运行,而不能在Raspberry Pi以及Raspberry Pi和Debian 9的VirtualBox VM上运行。我尝试了wxPython 3.0.2.0和4.0.3,分别使用gtk2和python 2.7和python 3.5:
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import wx
from threading import Timer
class MainWindow(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Test", size=(600, 100))
panel = wx.Panel(self)
self.gauge = wx.Gauge(panel, wx.ID_ANY, 100, (10, 10), (480, 10))
self.gaugeval = 0
self.gauge.SetValue(self.gaugeval)
self.Show()
Timer(1, self.loop).start()
def loop(self):
self.gaugeval += 1
if self.gaugeval > 100:
self.gaugeval = 0
self.gauge.SetValue(self.gaugeval)
Timer(0.01, self.loop).start()
app = wx.App(False)
frame = MainWindow()
app.MainLoop()
启动程序后,需要一秒钟,直到压力表应“活动”并从左到右填充该条,然后再次从左开始,依此类推。但是,在任何经过测试的Linux系统上,它都会很快冻结。
这是怎么回事?有人可以复制吗?我简直不敢相信这样一个简单的功能将行不通。非常感谢您查看此问题!
答案 0 :(得分:0)
我怀疑您的问题可能与使用线程模块中的Timer
有关。
使用wx.Timer
。
import wx
class MainWindow(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Test", size=(600, 100))
panel = wx.Panel(self)
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.onTimer, self.timer)
self.gauge = wx.Gauge(panel, wx.ID_ANY, 100, (10, 10), (480, 10))
self.Show()
self.timer.Start(100) # fire every 10th of a second
def onTimer(self, evt):
val = self.gauge.GetValue()
val += 1
if val > 100:
val = 0
self.gauge.SetValue(val)
app = wx.App(False)
frame = MainWindow()
app.MainLoop()