@bot.message_handler(content_types=['text'])
def get_command(message):
if message.text == "Start":
root = tk.Tk()
img = ImageTk.PhotoImage(Image.open('lol.png'))
createNewWindow(root, img)
root.mainloop()
elif message.text == "Stop":
root.destroy()
Ух как всё запущено.
Во-первых, если ты ввёл Start, то get_command() создаёт локальную root, настраивает её, и уходит в бесконечный цикл внутри root.mainloop(). Я не знаю как pytelegrambotapi разруливает это, но бот после такого должен просто встать колом, пока все окна не будут закрыты. Подозреваю что обработчик вызывается в отдельном потоке, но фз. В любом случае, не надо так делать. Лучше иметь один root, который крутится внутри mainloop() в отдельном потоке всё время работы скрипта, а окна создавать и удалять по мере надобности, не создавая и не убивая root.
Вообще подружить бота с оконным интерфейсом - задача нетривиальная.
Во-вторых, переменная root - локальная. Она существует только внутри того экземпляра get_command(), который был вызван с командой старт. Если ты вызываешь его с командой Stop, у тебя запускается отдельный экземпляр, где выполняется только ветка Stop - а в этой ветке root объявлен не был, он был объявлен только в ветке Start, в другом экземпляре.
В-третьих, окна будут спамиться только на той машине где запущен бот. Это так, на всякий случай.