2014-03-30 4 views
0

Я новичок в Tkinter и разработал только один графический интерфейс перед этим. Я решил создать случайный генератор рельефа, используя метки для представления блока, в сетке 10 x 10. Я закончил его и исправил утечку памяти при создании большого количества ярлыков. Я также реализовал случайную кнопку и прокрутку. Однако после того, как примерно 100 (около 98 последних проверок) проверили обновления сетки, они будут отображаться с серым фреймом, появляющимся вне окна, а верхняя часть мира станет серым, тогда программа перестанет отвечать на запросы. Сообщение об ошибке отсутствует, поэтому я не знаю, как это исправить. Код находится на pastebin по адресу: http://pastebin.com/SASFuQCZ, хотя он очень длинный. Любая помощь с фиксацией этого была бы весьма признательна. Благодарю.Сбой программы Tkinter после использования

+2

Думаю, вы выиграли приз за самый дубликат. Вероятно, вы можете сбить эти 1800 строк до пары сотен с помощью пары петель. Это значительно упростит ваш код. –

ответ

0

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

Знаете ли вы, что вы можете создавать виджеты в цикле? Вы можете легко удалить несколько сотен строк кода, используя очень простой метод. Кроме того, знаете ли вы, что вы можете изменить цвет существующей метки, не разрушая ее и не воссоздавая ее?

Наконец, вам не нужны все эти экземпляры StringVar, поскольку вы только сохраняете в них цвет. Будет нормальная переменная. StringVars действительно полезны только тогда, когда вы пытаетесь связать ярлык или значение двух или более виджетов вместе. Если вы хотите хранить цвета ячеек в переменных, сохраните их в той же структуре данных, которую вы используете для ярлыков, а затем ваша функция перерисовки просто должна сделать один цикл, чтобы применить каждый цвет к каждой ячейке.

Например, чтобы установить все начальные цвета в «королевский синий», вы можете сделать что-то вроде следующего. Я использую словарь, но вы можете использовать список списков примерно так же легко:

color = {} 
for row in range(10): 
    for column in range(10): 
     color[(row, column)] = "royal blue" 

Далее, вы можете создать сетку 10х10 этикетки с тем же простым циклом. Это может заменить 200 строк кода (плюс еще 100 пустых строк), которые вы используете для создания исходных меток только с 6 строками кода.

# to create the labels and store them in a dictionary: 
cell = {} 
for row in range(10): 
    for column in range(10): 
     l = Label(app, text="  ", background=color[(row, column)]) 
     l.grid(row=row, column=column) 
     cell[(row,column)] = l 

Вы можете обновить каждую метку с помощью configure. Так, например, изменить метку 0,0 до красного вы могли бы сделать это:

cell[(0,0)].configure(background="red") 

Вы можете получить цвет фона этикетки с помощью метода cget. Например, это будет печатать «красный»:

print cell[(0,0)].cget("background") 

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

+0

Спасибо за совет по сокращению кода. Я сделаю это и посмотрю, исчезнет ли проблема. Если нет, я буду размещать здесь новый код, который должен быть проще видеть. Я знал, что это было немного долго, но мне было трудно найти документацию по этому поводу, поэтому еще раз спасибо за помощь в сокращении моей программы. – user3477719

Смежные вопросы