wxPython标尺在Linux上冻结

时间:2018-08-08 20:28:26

标签: python linux wxpython

我正在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系统上,它都会很快冻结。

这是怎么回事?有人可以复制吗?我简直不敢相信这样一个简单的功能将行不通。非常感谢您查看此问题!

1 个答案:

答案 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()