Tkinter должен иметь корневое окно. Если вы его не создадите, вы будете созданы для вас. Если вы не хотите этого корневого окна, создайте его, а затем спрячьте его:
import Tkinter as tk
root = tk.Tk()
root.withdraw()
tkMessageBox.showinfo("Say Hello", "Hello World")
Другой ваш выбор - not использовать tkMessageBox, но вместо этого поместите свое сообщение в корневое окно. Преимущество такого подхода заключается в том, что вы можете заставить окно выглядеть так, как вы хотите, чтобы он выглядел.
import Tkinter as tk
root = tk.Tk()
root.title("Say Hello")
label = tk.Label(root, text="Hello World")
label.pack(side="top", fill="both", expand=True, padx=20, pady=20)
button = tk.Button(root, text="OK", command=lambda: root.destroy())
button.pack(side="bottom", fill="none", expand=True)
root.mainloop()
(лично я бы выбрал более объектно-ориентированный подход, но я пытаюсь сохранить маленький код для этого примера)
Взгляните на модуль Hanging_threads (доступный в PyPI) - он может дать вам несколько советов о том, где застрял ваш код Однако он склонен к ложным срабатываниям (например, если ваш сценарий ожидает сетевого подключения).