TKinter ويندوز لا تظهر عند استخدام المعالجة المتعددة على لينكس

StackOverflow https://stackoverflow.com/questions/410469

سؤال

أريد أن تفرخ عملية أخرى لعرض رسالة خطأ بشكل غير متزامن في حين أن بقية التطبيق لا يزال مستمرا.

أنا باستخدام multiprocessing وحدة في بيثون 2.6 إلى إنشاء عملية و أنا أحاول عرض النافذة مع TKinter.

هذا الكود يعمل على ويندوز, ولكن تشغيله على لينكس TKinter النافذة لا تظهر إذا اتصلت 'showerror("MyApp Error", "Something bad happened.")'.ذلك لا تظهر إذا كنت تشغيله في نفس العملية من خلال الدعوة showerrorprocess مباشرة.ونظرا لهذا, يبدو TKinter هو يعمل بشكل صحيح.لا يمكن الطباعة إلى وحدة التحكم والقيام بأشياء أخرى من عمليات ولدت من قبل multiprocessing, لذا يبدو أن العمل أيضا.

أنها فقط لا يبدو للعمل معا.يجب أن أفعل شيئا خاصا للسماح ولدت فرعية لإنشاء ويندوز ؟

from multiprocessing import Process
from Tkinter import Tk, Text, END, BOTH, DISABLED
import sys
import traceback

def showerrorprocess(title,text):
    """Pop up a window with the given title and text. The
       text will be selectable (so you can copy it to the
       clipboard) but not editable. Returns when the
       window is closed."""
    root = Tk()
    root.title(title)
    text_box = Text(root,width=80,height=15)
    text_box.pack(fill=BOTH)
    text_box.insert(END,text)
    text_box.config(state=DISABLED)
    def quit():
        root.destroy()
        root.quit()
    root.protocol("WM_DELETE_WINDOW", quit)
    root.mainloop()

def showerror(title,text):
    """Pop up a window with the given title and text. The
       text will be selectable (so you can copy it to the
       clipboard) but not editable. Runs asynchronously in
       a new child process."""
    process = Process(target=showerrorprocess,args=(title,text))
    process.start()

تحرير

يبدو أن المسألة التي TKinter تم استيرادها من قبل الوالدين العملية ، و "ورث" في عملية طفل, ولكن بطريقة أو بأخرى الدولة ارتباطا وثيقا العملية الأصل أنه لا يمكن العمل في الطفل.طالما كنت تأكد من عدم استيراد TKinter قبل أن تفرخ عملية طفل ، فإنه سيتم العمل ثم لأن الطفل هو العملية التي يتم استيراده لأول مرة.

هل كانت مفيدة؟

المحلول

هذا المناقشة يمكن أن تكون مفيدة.

هنا بعض مشاكل عينة وجدت:

  1. في حين أن وحدة المعالجة المتعددة يلي خيوط عن كثب, إنه بالتأكيد لا تطابق تام.مثال واحد:منذ المعلمات إلى يجب أن تكون عملية pickleable, كان لدي للذهاب من خلال الكثير من التعليمات البرمجية تغييرات لتجنب مرور Tkinter الكائنات منذ هذه ليست pickleable.هذا لا يحدث مع خيوط الوحدة.

  2. process.terminate() حقا لا يعمل بعد المحاولة الأولى.المحاولة الثانية أو الثالثة ببساطة توقف المترجم ، وربما لأن هياكل البيانات معطوبة (المذكورة في API, ولكن هذا هو عزاء).

نصائح أخرى

ربما يدعو الأمر shell xhost + قبل استدعاء البرنامج من نفس شل العمل ؟

اعتقد المشكلة تكمن مع X-server.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top