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

时间:2015-07-15 17:39:29

标签: python multithreading tkinter

我试图做一些表面看起来应该很简单的事情。

我在Python中执行一系列操作,以便必须在下一次开始之前完成:

operation1()
operation2()
operation3()

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

道歉,如果我不清楚,但我完全混淆了自己试图做这项工作!!!

1 个答案:

答案 0 :(得分:2)

这样做的一种方法是让主窗口(root)等待弹出窗口运行它的过程。

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

我已经创建了一个如何完成的小例子,我认为它应该给你这个想法。

基本上它会提示您输入int。成功时会显示​​一个弹出窗口(称为operation 2),提示您输入另一个intoperation 2完成后,主窗口的OK按钮的命令将更改为operation 3,这将破坏窗口。不过,我也可以在致电op3后致电root.wait_window(new);一旦弹出窗口完成(或op3应该做什么),这会破坏主窗口。

我还包括一个简单打印范围的for循环;这是为了说明 nothing 将继续,直到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()

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