Ваша проблема, возможно, связана с многопоточностью в Python 2 и с некоторыми модулями - в данном случае с Tkinter. У меня не очень хороший опыт работы с потоками в Python 2. Иногда в простых случаях это работает нормально, но когда что-то более сложное, потоки в Python 2 с некоторыми модулями могут быть непредсказуемыми.
Потоки в Python 3 гораздо более оптимизированы.
Так что в вашем случае у вас есть две возможности.
1) Поднимите вашу версию до Python 3, а именно в эти дни Python 3.6.
Код в Python 3 немного отличается, но в этом случае работает, как талисман, в соответствии с вашими ожиданиями.
from tkinter.messagebox import *
from tkinter import *
import _thread
def show_alert(title, msg):
showwarning(title=title, message=msg)
def onclick():
try:
_thread.start_new_thread(show_alert, ("test", "hahahaha!"))
except Exception as e:
print("error:", e)
if __name__ == "__main__":
_root = Tk()
_root.resizable(width='false', height='false')
_root.title("Test")
_submitButton = Button(_root, text="submit", width=10, command=onclick)
_submitButton.pack(side=RIGHT, padx=20)
_root.mainloop()
2) Если вам нужно остаться с Python 2, постарайтесь избежать многопоточности, чтобы вы могли вызывать showwarning
непосредственно в onclick()
from tkMessageBox import *
from Tkinter import *
def onclick():
try:
showwarning(title="test", message="hahahaha!")
except Exception as e:
print "error:", e
if __name__ == "__main__":
_root = Tk()
_root.resizable(width='false', height='false')
_root.title("Test")
_submitButton = Button(_root, text="submit", width=10, command=onclick)
_submitButton.pack(side=RIGHT, padx=20)
_root.mainloop()