0

我有一个包含不同天体的大型数据库,我希望能够在 GUI 中为它们显示不同的信息。但是,我发现了一个大问题,不知道是否有办法治疗它或者我不得不放弃这个想法。

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

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

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

  3. 当坏点被删除时,用户可以点击不同的按钮来对源进行分类(比如“星”、“星系”、“随便”)。

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

问题是,如果我这样做,我必须与 root.mainloop() 声明作斗争。鉴于对象的计算很复杂,涉及到很多代码,为了清楚起见,我非常希望避免在 GUI 中包含此代码。但否则,我将不得不打开一个 Tkinter 窗口,分类一个对象,关闭它,打开一个新对象,......这既耗时又令人不安......

有没有办法在 GUI 部分之外进行计算并将参数传递到 Tkinter 窗口而无需清除它?

谢谢!

4

1 回答 1

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 不做任何事情的所有时间。

于 2013-02-03T22:19:05.993 回答