Tkinter в Python — это должно быть медленно или узкое место где-то еще в программе?

#python #python-3.x #tkinter

#python #python-3.x #tkinter

Вопрос:

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

Проблема в том, что когда мы начинаем создавать блоки, когда одновременно отображается несколько блоков (скажем, 80), созданных с использованием метода create_rectangle, если мы начнем перемещать их повсюду, это становится действительно прерывистым. В той части игры, которую мы показываем в то время, есть пара элементов (некоторые с использованием небольших GIF-файлов) для нескольких меню, а на холсте есть объекты, о которых я только что упомянул, и некоторые небольшие здания, также использующие небольшие GIF-файлы.

Мы используем метод after для обратного вызова метода, который удаляет все на холсте, а затем перерисовывает все здания и юниты в их правильных положениях каждые 50 миллисекунд.

Должно ли это быть чем-то, что легко обрабатывается Tkinter, или проблема в самой нашей программе?

Комментарии:

1. Предполагается, что он должен быть медленным, они разработали его таким образом, чтобы вы могли видеть, что он делал во время работы. Никому не нравятся хитрые программы, которые работают слишком быстро — просто шучу 🙂

2. @Ron Я должен был сформулировать свой вопрос лучше, ха-ха.

3. По моему опыту, tkinter работает чрезвычайно медленно

4. Вы обнаружите какие-либо изменения, если отбросите стиль?

Ответ №1:

Никто не сможет ответить на этот конкретный вопрос, потому что это зависит от множества факторов. Когда у вас проблемы с производительностью, вы должны измерить время, которое вы тратите на каждую функцию, чтобы определить, где находятся узкие места. Это называется профилированием, и у вас есть хороший учебник здесь для python, встроенного в профилировщик:http://docs.python.org/library/profile.html

Вы ищете информацию двух типов:

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

  • функции, внутри которых вы проводите больше всего времени, исключая вызовы других функций. Там у вас будут базовые функции. Те, которые часто вызываются и т.д. Опять же, если некоторые результаты вас удивляют: исследуйте своими глазами.

если вы обнаружите, что большая часть времени тратится на внутренние компоненты tkinter, то вы можете использовать его неправильно. Попробуйте изолировать небольшую автономную программу, выполняющую вызовы tkinter и показывающую аналогичную проблему с производительностью, и опубликуйте ее здесь. Информация о профилировании должна быть полезной для этой задачи.

Комментарии:

1. Спасибо за ваш ответ. Я обязательно прочитаю это руководство и профилирую свою программу!

2. Я профилировал его, и кажется, что программа тратит слишком много времени на функцию, которая должна быть быстрой. Я уже быстро исправил это, и я уже замечаю огромный прирост производительности. Спасибо!

Ответ №2:

Tk может работать умеренно хорошо, но для написания игры вы, вероятно, будете иметь гораздо лучшую производительность из коробки, если вы используете библиотеку, подобнуюhttp://pygame.org

Комментарии:

1. Я знаю, что pygames были бы лучшим вариантом, но поскольку это для школы, мы ДОЛЖНЫ использовать Tkinter для этого проекта, чтобы каждая команда использовала библиотеку, с которой учитель более знаком. Кроме того, если вы говорите, что tk может работать умеренно хорошо, я собираюсь посмотреть, смогу ли я улучшить некоторые части наших кодов. Спасибо!