我有一个包含不同天文物体的大型数据库,我希望能够在GUI中显示不同的信息。但是,我发现一个大问题,不知道是否有任何对待它,或者我不得不放弃这个想法。
对于这些来源中的每一个,在绘制任何内容之前需要执行大量计算。我的想法是打开一个主GUI窗口,然后逐个对象:
首先进行计算。使用python通过mysql命令从数据库中获取信息。在这个阶段结束时,我将有两个或三个阵列将被绘制。
使用GUI显示这些图。在此阶段,用户可以通过单击使用事件来删除一些坏点(因此GUI应该能够与数据库通信)。删除某些点后,必须更新图表。
删除坏点后,用户可以点击不同的按钮对来源进行分类(比如说“星”,“星系”,“无论什么”)。
一旦用户点击了任何分类按钮,程序就会跳转到数据库中的下一个源,然后再次启动该过程。
问题是,如果我这样做,我必须使用root.mainloop()语句进行操作。鉴于对象的计算很复杂,涉及到很多代码,为了清楚起见,我希望避免在GUI中包含这些代码。但除此之外,我必须打开一个Tkinter窗口,对一个对象进行分类,关闭它,打开一个新对象,......这很耗费时间和令人不安......
有没有办法在GUI部件外进行计算并将参数传递给Tkinter窗口而不必清除它?
谢谢!
答案 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在其他任何时候都没有做任何事情。