好的,我意识到这不是一个非常明确的标题,所以希望这可以更好地澄清它(如果有人能为它提出一个更清晰的名字,我会很感激帮助! )。
我正在为幼儿园班级创建一个积分跟踪器。我在脑海中看到的是一个底部为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感知功能?
答案 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块中调用。这将阻止任何其他事件循环,因此最好将其简单地用作主循环,处理退出以及需要响应的任何其他事件。