0

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

我正在为我的幼儿园班级创建一个积分跟踪器。我在脑海中看到的是一个底部为 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 感知”的函数来实现这样的事情?

4

2 回答 2

1

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

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

于 2012-07-05T14:25:22.910 回答
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 块中调用。这将阻止任何其他事件循环,因此最好将其用作主循环,处理退出和您需要响应的任何其他事件。

于 2012-07-05T16:31:39.353 回答