我很抱歉如果这个问题的答案很明显,但我不熟悉Python的内部工作原理。如何让脚本等待按钮按下?
基本情景:我有一个Python脚本来完成任务。定期地,当满足某些条件时(比如设置标志变量),我希望脚本暂停并等待用户按下GUI按钮。
我该如何执行此操作?为了澄清,我希望它像input()一样工作,因为它暂停了一切,并等待函数调用被解析,除了我不想将它与文本绑定,而是一个GUI按钮。我打算使用Tkinter制作按钮。
我最初的想法是做一个while循环是这样的:
x = 2
while (x > 1):
#do nothing
然后该按钮将调用设置x = 0
这是做到这一点的正确方法的功能?有没有更好的办法?我错过了明显的东西?
示例代码:
class Displayable(object):
max_display_level = 1 # can be overridden in subclasses
manual_step = False # can be overridden in subclasses
def display(self,level,*args,**kwargs):
-Do stuff unrelated to the question-
if (self.manual_step):
if level <= self.max_display_level:
input("Waiting for input: ")
背后的想法,这是对象将扩展类可显示和设定自己的max_display_level和manual_step值。更高的max_display_level意味着将显示更多的消息(即,如果我用level = 1,2,3和4调用display(),如果我的max_display_level == 2,只有前2个调用将执行所有逻辑。是一种允许用户设置执行的详细程度的方法,这是我不会涉及的原因,但它应该保持不变。)如果特定对象具有manual_step == true并且级别满足当调用display()时,它应该等待用户输入。诀窍是我希望它等待按钮按下而不是文本+输入。
忙碌的等待不是一个好习惯。通常你会想用'time.sleep()'来暂停脚本(这可以让系统上的其他进程运行)。也就是说,一般来说,图形用户界面不会暂停,它们会进入一种状态,在这种状态下,大多数事件会被忽略,直到发生状态改变。最后,'tkinter'不支持多线程本身。如果你仔细的话,可以在线程中做非gui的事情。没有更多细节(或示例代码)在你的问题中,我不能更具体。 – martineau
脚本是单线程的,我不是故意暗示它是多线程的。我也并不关心“按钮输入”是做什么的,只要它让所有其他事情等待它被解决/按下。如果您有任何想法,我正在倾听。 – GreySage
您要求的东西的名称是_modal dialog_。一旦显示,它会暂停GUI,直到用户作出响应。网上有很多关于在tkinter中创建模态对话框的例子。 –