2014-04-19 36 views
0

我正试图将程序从tkinter过渡到Kivy。当我到了一个使用messagebox.askyesno的部分时,我想我可以用一些按钮创建一个弹出窗口,然后我就完成了。我遇到的问题是,虽然Kivy的弹出窗口和tkinter的消息框都是模态的,但当我在函数中调用messagebox.askyesno时,messagebox将暂停当前函数的所有执行,直到消息框被销毁,而弹出窗口将允许函数完。我原来的计划不得不Kivy等同于tkinter的消息框

flag = messagebox.askyesno(message='...',parent=self) 
if flag: 
    #Stuff if flag is true 
else: 
    #Stuff if flag is false 

然而,这不会有Kivy弹出工作,因为弹出窗口将打开,程序将继续执行。有没有办法停止执行,直到弹出窗口被销毁,或以其他方式解决问题?

基本思想是双人游戏的准对话。在这里,程序询问一个玩家是否想要执行一个动作,比如移动一块。如果玩家说“是”,那么第二位玩家得到messagebox.askyesno作为反击。一个简单的比喻就是推动一名垒球运动员从一垒到三垒。如果他想要推进跑步者,或者让跑步者保持第二名,你将不得不问问进攻球队。如果答案是肯定的,那么该计划将不得不询问防守球队是否想要屈居第三。它肯定有可能创建一个函数来处理askyesno的每个实例,并带有适当的绑定,但似乎过多。

回答

2

我不太了解tkinter是怎么做的,但是kivy需要一个稍微不同的心理模型。你不想在Python代码之间停止和启动eventloop,而是想要启动弹出窗口,将你需要的任何状态传递给它或存储在其他地方,然后绑定弹出窗口的结果(例如,当用户按下“完成”按钮)一些新的功能,可以完成剩下的计算。

我可以提供一个例子,如果你喜欢,特别是如果你提供更多关于你想要做的事情的信息。

+0

您的评估是我曾经考虑的事情,如果这种情况只发生一次,那么它是可行的。但是,我至少有10个askyesno实例,尽可能在每次发生时都这样做,似乎是过度杀伤。 –

+0

为什么它会过度杀伤......你仍然只需要编写一次代码?也许你可以提供一个更完整的例子。 – inclement

+0

我已经编辑了一个,希望更清晰地说明我正在做什么。虽然你的想法很有效,但我认为必须要有一个比打破功能更清洁的解决方案,至少在我的情况下是10个,来利用弹出窗口。 –