Я новичок в 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
- 1. Сбой программы после использования scanf
- 2. Java - сбой программы после многократного использования writeBytes
- 3. Сбой программы C++ после использования -> Оператор
- 4. Создание Tkinter Photoimage сбой программы python
- 5. Сбой программы Twisted/tkinter при выходе
- 6. Сбой программы Python Tkinter с записью
- 7. Сбой программы после правильной компиляции
- 8. Сбой программы C после strcpy
- 9. Сбой программы QT после подключения()
- 10. Сбой программы после того, как конструктор называется
- 11. Сбой сборки после использования CocoaPods
- 12. Qt macdeployqt - сбой после использования
- 13. Сбой программы?
- 14. Простые сбои программы после использования переключателя - C
- 15. python - While Loop вызывает сбой всей программы в Tkinter
- 16. сбой программы
- 17. Сбой программы
- 18. Сбой программы после выполнения функции strcpy()
- 19. Сбой программы после попытки закрыть() последовательный порт
- 20. Сбой программы C после печати нескольких строк
- 21. Сбой программы после добавления subview от NSMutableArray
- 22. Сбой программы C после ввода char
- 23. Сбой программы C после 2 reallocs
- 24. Сбой программы после нажатия кнопки «Отправить»
- 25. C Сбой программы после последнего ввода
- 26. Сбой программы через 5 секунд после ввода?
- 27. Сбой программы на C++ после выхода
- 28. tkinter после использования метода в Button
- 29. Сбой программы отладки программы 0
- 30. atoi() делает сбой программы
Думаю, вы выиграли приз за самый дубликат. Вероятно, вы можете сбить эти 1800 строк до пары сотен с помощью пары петель. Это значительно упростит ваш код. –