暂停执行,直到从 tkinter 窗口收到用户输入

Posted

技术标签:

【中文标题】暂停执行,直到从 tkinter 窗口收到用户输入【英文标题】:Pause execution until user input received from tkinter window 【发布时间】:2015-07-15 17:39:28 【问题描述】:

我正在尝试做一些表面上看起来应该很简单的事情。

我正在 Python 中执行一系列操作,因此必须在下一个开始之前完成:

operation1()
operation2()
operation3()

但是,operation2() 需要用户从弹出窗口中的 tkinter 输入框中输入。一旦我创建了这个弹出窗口,operation3() 就会执行。我该如何防止这种情况? operation2() 可以创建弹出窗口并进入无限循环,但弹出窗口中的按钮必须运行一个会打破该循环的函数。最好的方法是什么? operation2()operation3() 开始之前完成,这一点很重要。

抱歉,如果我不清楚,但我完全困惑自己试图使这项工作!!!

【问题讨论】:

你应该让你的弹出窗口模态[如何在 tkinter 中创建模态对话框?][1] [1]:***.com/questions/16803686/… 为什么不在按钮的回调函数中包含operation3() 【参考方案1】:

这样做的一种方法是让您的主窗口(@98​​7654321@)等待弹出窗口运行。

这是通过正常创建一个弹出窗口来完成的(我假设使用Toplevel() 小部件),然后调用root.wait_window(theToplevel)

我创建了一个小例子来说明这是如何完成的,我认为它应该会给你一些想法。

基本上它会提示您输入int。成功后会出现一个弹出窗口(称为operation 2),提示您输入另一个intoperation 2完成后,主窗口OK按钮的命令变为operation 3,会销毁窗口。但是,我也可以在调用root.wait_window(new) 之后简单地调用op3;一旦弹出窗口完成(或op3 应该做的任何事情),这将破坏主窗口。

我还包含了一个简单地打印范围的 for 循环;这是为了说明在Toplevel 完成收集数据之前,什么都没有

示例代码如下:

from Tkinter import *
from tkMessageBox import *
root = Tk()
val = 0
val2 = 0

def op1():

    global e, l, root, val, e2, b, new
    try:
        val = int(e.get())
    except ValueError:
        showerror("Error", "Enter an int")
    else:
        new = Toplevel()
        e2 = Entry(new)
        e2.pack(side = LEFT)
        b2 = Button(new, text = "OK", command = op2)
        b2.pack(side = RIGHT)
        l2 = Label(new, text = "Enter new number to multiply %d by" %val)
        l2.pack()
        e2.focus_force()
        root.wait_window(new)
        for i in range(5):
            print (i + 1)

def op2():
    global val
    try:
        val2 = int(e2.get())
    except ValueError:
        showerror("Error", "Enter an int")
        e2.focus_force()
    else:
        val = val * val2
        l.config(text = "This is your total: %d Click OK to exit" %val)
        new.destroy()
        b.config(command = op3)
def op3():
    root.destroy()

e = Entry(root)
e.pack(side = LEFT)
b = Button(root, text = "OK", command = op1)
b.pack(side = RIGHT)
l = Label(root, text = "Enter a number")
l.pack()
root.mainloop()

我希望这可以帮助您解决问题。

【讨论】:

没问题,乐于助人 如果不使用弹出窗口输入条目,我将如何做到这一点?假设条目在主窗口中,我希望焦点锁定在输入框上,直到输入某些内容? @Shihab Dider 解决方案不止一种,但一种方法是禁用其他小部件,直到在输入框中检测到有效结果。我建议您提出一个问题,以便您可以尝试找到适合您情况的答案,因为这与所提出的问题完全不同。

以上是关于暂停执行,直到从 tkinter 窗口收到用户输入的主要内容,如果未能解决你的问题,请参考以下文章

tkinter窗口鼠标拖动就会暂停

暂停执行直到收到套接字上的特定消息?

Tkinter 文本输入的返回值,关闭 GUI

Tkinter:等待用户点击

TKinter 教程

Facebook 聊天 API - XMPP 输入暂停通知