'席卷'点吧实施

时间:2012-07-05 09:26:19

标签: python wxpython

好的,我意识到这不是一个非常明确的标题,所以希望这可以更好地澄清它(如果有人能为它提出一个更清晰的名字,我会很感激帮助! )。

我正在为幼儿园班级创建一个积分跟踪器。我在脑海中看到的是一个底部为0,顶部为100的条形图,以及从0到100上下扫描的颜色渐变点条。当它们碰到触摸屏时,条形图冻结,团队得到x分,其中x是酒吧冻结的数字。

现在,我正在处理移动栏的功能(避难所甚至还没有进行冻结/打断)。我把它放在一起,但感觉真的很不雅和丑陋。

def score_inc():
    x = 0
    while x < 100:
        x += 1
        time.sleep(0.01)
    while x > 100:
        x -= 1
        time.sleep(0.01)

更不用说,我有理由相信这段代码会阻止操作,这意味着我无法显示/更新图形。

这是我第一次涉足GUI编程,因此我在编写图形前端之前谨慎地尝试编写无GUI的后端,这是错误的路径吗?是否有一种更平滑,更难看的方式来实现类似这样的功能,因为缺乏一个更好的术语,使用GUI感知功能?

2 个答案:

答案 0 :(得分:1)

在wxPython中,你可能想要使用wx.Slider,虽然我不认为它支持你正在寻找的颜色。但是,您可以将滑块事件绑定到可以为您执行此操作的wx.GCDC或wx.PaintDC。我会在wxPython用户组中询问其他建议。

你是对time.sleep()阻止GUI的主循环。如果您这样做,您的GUI将不会响应。相反,你应该使用wx.Timer。这是一个tutorial。你可以将time.sleep()放入一个线程中,但我认为这样做太过分了,并且会使它变得不必要地复杂化。

答案 1 :(得分:1)

实现条移动的最简单方法不是单独的函数,而是与中断在同一个循环中:

def barLoop():
    current_score = 0
    increment = True
    while True:
        ## HANDLE INTERRUPT HERE ##
        if increment:
            current_score += 1
            if current_score == 100: #stop incrementing at 100
                increment = False
        else:
            current_score -= 1
            if current_score == 0: #start incrementing again at 0
                increment = True 

这具有使得得分变量暴露于中断所捕获的优点。无论您需要调用哪些GUI函数来以图形方式更新条形位置,都可以在if / else块中调用。这将阻止任何其他事件循环,因此最好将其简单地用作主循环,处理退出以及需要响应的任何其他事件。