tkinter root.mainloop()不合适?

时间:2013-02-03 19:55:29

标签: python matplotlib tkinter

我有一个包含不同天文物体的大型数据库,我希望能够在GUI中显示不同的信息。但是,我发现一个大问题,不知道是否有任何对待它,或者我不得不放弃这个想法。

对于这些来源中的每一个,在绘制任何内容之前需要执行大量计算。我的想法是打开一个主GUI窗口,然后逐个对象:

  1. 首先进行计算。使用python通过mysql命令从数据库中获取信息。在这个阶段结束时,我将有两个或三个阵列将被绘制。

  2. 使用GUI显示这些图。在此阶段,用户可以通过单击使用事件来删除一些坏点(因此GUI应该能够与数据库通信)。删除某些点后,必须更新图表。

  3. 删除坏点后,用户可以点击不同的按钮对来源进行分类(比如说“星”,“星系”,“无论什么”)。

  4. 一旦用户点击了任何分类按钮,程序就会跳转到数据库中的下一个源,然后再次启动该过程。

  5. 问题是,如果我这样做,我必须使用root.mainloop()语句进行操作。鉴于对象的计算很复杂,涉及到很多代码,为了清楚起见,我希望避免在GUI中包含这些代码。但除此之外,我必须打开一个Tkinter窗口,对一个对象进行分类,关闭它,打开一个新对象,......这很耗费时间和令人不安......

    有没有办法在GUI部件外进行计算并将参数传递给Tkinter窗口而不必清除它?

    谢谢!

1 个答案:

答案 0 :(得分:1)

您可以在工作线程中或在单独的进程中运行计算。

对于任何单一计算,是否可以在不到一秒的时间内完成?如果是这样,请让事件循环为您而不是对您起作用。如果您可以以某种方式将所有计算放在列表,迭代器或生成器中,则可以使用after运行每个计算。

粗略地说,您的代码看起来像这样:

def do_one_calculation():

    <do the next calculation here>

    if there_are_more_calculations():
        root.after(100, do_one_calculation)

根据计算的速度或速度,您可以通过将第一个参数调整为after来每秒执行更多或更少的操作。实际效果是计算在“后台”运行,在GUI中,这意味着GUI在其他任何时候都没有做任何事情。