tkinter listbox:通过函数1到1添加行到列表框

时间:2014-09-09 14:12:56

标签: python for-loop listbox tkinter diophantine

我有一个以整数形式接受用户输入的程序,我们称之为k。另外三个数字是已知的,a,b和c。我的任务是找到所有正整数解{x,y,z} ax + by + cz = k。我编写了一个方法,我调用内置a,b和c的对象。还有一个额外的约束,即x + y + z不能大于已知的整数p。

    def find_all_solutions(self, k):
        for x in range(0, k/c +1):
            for y in range(0, k/c +1):
                for z in range(0,k/c +1):
                    if x+y+z <= self.p and self.a*x+self.b*y+self.c*z == k:
                        one_solution = [x,y,z]
                        list_of_combinations.insert(END,"x: {0}, y: {1}, z: {2} ".format(one_solution[0], one_solution[1], one_solution[2]))
    K = IntVar()
    KassaBox= Entry(TeaterGUI, relief=GROOVE,textvariable=Kassa,width="15")
    KassaBox.place(x="400",y="240")


    KombinationsKnapp = Button(TeaterGUI, text="Tryck har for att visa alla mojliga kombinationer", command= lambda: TeaterLista[Teater_Index.get()].find_all_solutions(K.get()))
    KombinationsKnapp.place(x="400",y="260")

当k有点小(<100000)时,这有效,虽然它超过3位数时,解释器在进行计算时冻结了几秒钟,但最终它完成了它应该做的事情。

我的问题是,如果k更大,那么必须检查的组合数量太多,无法处理python解释器。

所以我在想,也许避免这些崩溃的方法是,而不是程序找到所有解决方案并立即添加所有解决方案,以使程序找到每个解决方案并将其逐个添加到列表框中,以避免计算机在使用前将大量信息存储在RAM中。但是,使用tkinters .insert方法看起来像是用信息附加列表框的唯一方法,我不知道该怎么做。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:-1)

而不是这一行:

list_of_combinations.insert(END,"x: {0}, y: {1}, z: {2} ".format(one_solution[0], one_solution[1], one_solution[2]))
你可以这样做:

yield "x: {0}, y: {1}, z: {2} ".format(one_solution[0], one_solution[1], one_solution[2])

然后添加到列表框中,您可以执行一个简单的迭代循环:

for solution in find_all_solutions(k):
    listbox.insert("end", solution)

这将使您的生成器函数一次产生一个答案,并允许您将它们一个接一个地添加到列表框中。

然而,由于程序在发生时从未到达mainloop,因此窗口永远不会更新。你可以在每次插入之间手动调用window.update(),但这会减慢你的计算速度。

一些更好的选择是:
1)在进入此计算循环之前,添加如下函数:

def myupdate():
    window.update()
    window.after(100, myupdate)

然后在开始循环之前添加如下行:

window.after(100, myupdate)

您将有效地启动线程更新循环,其中窗口将大致每100毫秒更新

2)添加一个单独的子循环以在每隔这么多插入后更新窗口

例如:

a = 0
for solution in find_all_solutions(k):
    listbox.insert("end", solution)
    a += 1
    if a == 10: #would update every 10 inserts
        window.update()
        a = 0