我试图做一些表面看起来应该很简单的事情。
我在Python中执行一系列操作,以便必须在下一次开始之前完成:
operation1()
operation2()
operation3()
但是,operation2()
需要用户输入来自弹出窗口中的tkinter Entry框。创建此弹出窗口后,operation3()
将执行。我该如何防止这种情况? operation2()
可以创建弹出窗口并输入一个无限循环,但弹出窗口中的一个按钮必须运行一个会打破该循环的函数。最好的方法是什么? operation2()
在operation3()
开始之前完成非常重要。
道歉,如果我不清楚,但我完全混淆了自己试图做这项工作!!!
答案 0 :(得分:2)
这样做的一种方法是让主窗口(root
)等待弹出窗口运行它的过程。
这是通过正常创建弹出窗口(使用我假设的Toplevel()
小部件),然后调用root.wait_window(theToplevel)
来实现的。
我已经创建了一个如何完成的小例子,我认为它应该给你这个想法。
基本上它会提示您输入int
。成功时会显示一个弹出窗口(称为operation 2
),提示您输入另一个int
。 operation 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()
我希望这可以帮助您解决问题。