我有一个以整数形式接受用户输入的程序,我们称之为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方法看起来像是用信息附加列表框的唯一方法,我不知道该怎么做。
非常感谢任何帮助!
答案 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