2014-09-09 5 views
0

У меня есть программа, которая принимает пользовательский ввод в виде целого числа, позволяет называть его k. Известны три других числа: a, b и c. Моя задача - найти все положительные целочисленные решения {x, y, z} такие, что ax + by + cz = k. Я написал метод, который я вызываю для объектов с встроенными a, b и c. Существует дополнительное ограничение, в котором говорится, что x + y + z не может быть больше, чем известное целое число p.tkinter listbox: добавление строк в список 1 по 1 через функцию

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") 

Это работает, когда к нескольким небольшим (< 100000), хотя, как он превышает 3 цифры интерпретатор замерзает в течение нескольких секунд, как он делает свои расчеты, но в конце концов он делает то, что его предполагается.

Моя проблема в том, что если k больше, количество комбинаций, которые необходимо проверить, становится слишком большим, чтобы обрабатывать интерпретатор python.

Так что я думал, что, возможно, способ избежать этих сбоев - вместо того, чтобы программа находила все решения и добавляла их все сразу, чтобы программа находила каждое решение и добавляла его один за другим к listbox, чтобы избежать хранения компьютером большого количества информации в его RAM до его использования. Тем не менее, с помощью метода tkinters .insert, похоже, единственный способ добавления списка с информацией, я не знаю, как это сделать.

Любая помощь была бы принята с благодарностью!

ответ

0

вместо этой строки:

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]) 

затем добавить в ListBox вы могли бы сделать простой итерационный цикл:

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 
+0

Не уверен, что если генератор поможет в данном случае, учитывая 'one_solution' в настоящее время постоянно переписываются и не занимая какой-либо дополнительной памяти в итерация. Самая большая проблема заключается в том, что Tkinter должен хранить все эти значения где-то.Я верю, что генератор поможет здесь, но я бы предложил изменить методы «range» на «xrange», чтобы не удерживать такой большой диапазон в памяти три раза. – 2014-09-09 14:52:25

+1

нет, он говорит, что он генерирует все решения сразу, а затем добавляет их в графический интерфейс, поэтому задержка исходит из времени, затраченного на вычисление решений, разлагая это один за другим, графический интерфейс не должен зависеть, пока результаты вычислен. –

+0

цитата из вопроса: «Итак, я думал, что, возможно, способ избежать этих сбоев - это вместо того, чтобы программа находила все решения и добавляла их сразу» –