tkinter顺序执行排序

时间:2013-08-23 20:19:30

标签: python-3.x tkinter sequence execution

我遇到了这段代码无法解决的问题。我无法真正描述措辞中的问题,但在代码中,window.mainloop()下的剩余代码将不会按需要运行,除非关闭主窗口(gui),这是有问题的。当def计算下的所有代码都已完全执行时,我希望能够print(t.test)。我在技术上可以通过删除window.mainloop()来做到这一点但是这将在我收集输入之前运行代码,这是至关重要的。我需要保持编码结构与下面所示的相同。

import tkinter

class Test:

  def __init__(self):
    self.test = False

def calculate(window, userinput, t):
  test = userinput.get()
  print(test)
  window.destroy()
  t.test = True

def main():

  t = Test()
  gui = tkinter.Tk()
  gui.title("example window")
  gui.geometry("400x400")

  userinput = tkinter.StringVar()

  window = tkinter.Toplevel()
  window.title("Entry")
  tkinter.Message(window, text="Label", width="200").pack()
  tkinter.Entry(window, width=30, textvariable=userinput).pack()
  tkinter.Button(window, text="ok", command=lambda: calculate(window, userinput, t)).pack()
  window.mainloop()

  print(t.test)

  gui.mainloop()

main()

修改 通过将print(t.test)置于其自己定义的函数下,然后在最后一行的def calculate(userinput, window, t)下调用它,我似乎能够使其行为方式相同并保持相同的结构。我测试了这个,但它导致主窗口冻结。

1 个答案:

答案 0 :(得分:0)

tkinter的工作方式是你:

  1. 制作小部件
  2. 调用mainloop(恰好一次)
  3. 窗口被销毁,程序退出
  4. 你不应该多次调用mainloop,并且在调用mainloop之后你不应该有更多的代码。

    如果您想在调用mainloop后运行某些内容,请使用after进行安排:

    ...
    gui.after(1, do_something)
    gui.mainloop()
    

    after计划的任何内容都将在mainloop启动后运行。