تالار گفتمان nCIS.ir

نسخه‌ی کامل: اجرای dialog box در ترد فرعی (حل شد)
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
من یه برنامهء بدون GUI دارم که بعضی وقتا نیاز داره یک dialog box ساده به کاربر نشون بده.
این برنامه توی یک حلقهء بینهایت مدام در حال اجراست. وقتی یک modal dialog نمایش داده میشه، اجرای برنامه تا وقتی که dialog box بسته نشه متوقف میشه. ولی من نمیخوام اینطور بشه چون برنامه مدام باید با برنامهء دیگری در حال تبادل ارتباط باشه.
خواستم dialog box روی ترد دیگری اجرا کنم که برنامه بلاک نشه، اما ظاهرا نمیشه و مشکل داره، یعنی دفعهء اول dialog box رو نشون میده اما دفعه های بعدی به مشکل میخوره.

با این نمونه کد مثلا میتونید تست کنید:
import tkinter
import tkinter.messagebox
import threading
import time

def messageBox():
	root=tkinter.Tk()
	root.withdraw()
	tkinter.messagebox.showinfo('', 'test')
	root.destroy()

i=0
while True:
	i+=1
	threading.Thread(target=messageBox).start()
	time.sleep(5)
از Python 3.3.4 روی ویندوز XP SP3 استفاده میکنم.

چطور میشه این مشکل رو حل کرد؟
خب ظاهرا tkinter زیاد از ترد بازی خوشش نمیاد!
بعضی جاها توصیه هم شده که GUI روی ترد اصلی برنامه باشه.
خب من این مشکل رو چطور حل کردم؟
کدهای مربوط به نمایش dialog رو کلا بردم توی یک اسکریپت پایتون جداگانه، و هر وقت نیاز به نمایش dialog دارم، از داخل برنامهء اصلی اون رو اجرا میکنم.
البته میشه راه حل های دیگری هم اندیشید، ولی بنظرم این راحت ترین و سریع ترین گزینه بود و باعث شد به ترکیب اصلی برنامه دست نزنم و نیاز به حداقل تغییرات و کدنویسی رو داشت.