Я новичок в Tkinter и разработал только один графический интерфейс перед этим. Я решил создать случайный генератор рельефа, используя метки для представления блока, в сетке 10 x 10. Я закончил его и исправил утечку памяти при создании большого количества ярлыков. Я также реализовал случайную кнопку и прокрутку. Однако после того, как примерно 100 (около 98 последних проверок) проверили обновления сетки, они будут отображаться с серым фреймом, появляющимся вне окна, а верхняя часть мира станет серым, тогда программа перестанет отвечать на запросы. Сообщение об ошибке отсутствует, поэтому я не знаю, как это исправить. Код находится на pastebin по адресу: http://pastebin.com/SASFuQCZ, хотя он очень длинный. Любая помощь с фиксацией этого была бы весьма признательна. Благодарю.Сбой программы Tkinter после использования
ответ
Возможно, кто-то еще может понять это, но для меня ваш код просто слишком сложно понять. Однако, хотя я не могу решить проблему, я могу дать несколько советов, которые могут помочь вам вырезать, пожалуй, одну тысячу строк кода, что может затруднить задачу.
Знаете ли вы, что вы можете создавать виджеты в цикле? Вы можете легко удалить несколько сотен строк кода, используя очень простой метод. Кроме того, знаете ли вы, что вы можете изменить цвет существующей метки, не разрушая ее и не воссоздавая ее?
Наконец, вам не нужны все эти экземпляры 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")
Используя все эти методы могли бы сократить ваш код вниз только пару сотен строк, которые будут делать какие-либо ошибки, вы должны легче обнаружить.
Спасибо за совет по сокращению кода. Я сделаю это и посмотрю, исчезнет ли проблема. Если нет, я буду размещать здесь новый код, который должен быть проще видеть. Я знал, что это было немного долго, но мне было трудно найти документацию по этому поводу, поэтому еще раз спасибо за помощь в сокращении моей программы. – user3477719
Думаю, вы выиграли приз за самый дубликат. Вероятно, вы можете сбить эти 1800 строк до пары сотен с помощью пары петель. Это значительно упростит ваш код. –