كيف يمكنني تجميد تطبيق ثنائي الوضع (واجهة المستخدم الرسومية ووحدة التحكم) باستخدام CX_Freeze؟

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

  •  04-10-2019
  •  | 
  •  

سؤال

لقد قمت بتطوير تطبيق Python يعمل في وضع واجهة المستخدم الرسومية ووضع وحدة التحكم. إذا تم تحديد أي وسيطات ، فسيتم تشغيله في وضع وحدة تحكم أخرى ، فهو يعمل في وضع واجهة المستخدم الرسومية.

لقد تمكنت من تجميد هذا باستخدام cx_freeze. واجهت بعض المشكلات التي تخفي نافذة وحدة التحكم السوداء التي ستظهر مع wxpython ولذا قمت بتعديل بلدي setup.py السيناريو مثل هذا:

import sys

from cx_Freeze import setup, Executable

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(
        name = "simple_PyQt4",
        version = "0.1",
        description = "Sample cx_Freeze PyQt4 script",
        executables = [Executable("PyQt4app.py", base = base)])

هذا يعمل بشكل جيد ولكن الآن عندما أحاول فتح وحدة التحكم الخاصة بي وتشغيل القابل للتنفيذ من هناك ، فإنه لا يخرج أي شيء. لا أحصل على أي أخطاء أو رسائل ، لذا يبدو أن CX_FEESE يعيد توجيه الأمراض المتنوعة في مكان آخر.

هل من الممكن تشغيله مع كلا الوضعين؟ لا شيء مشابه لهذا يبدو أنه موثق في أي مكان. :(

شكرا مقدما.

Mridang

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

المحلول

لقد وجدت هذا الشيء هذه صفحة:

نصيحة للإصدار أقل من وحدة التحكم: إذا حاولت طباعة أي شيء ، فستحصل على نافذة خطأ سيئة ، لأن Stdout و Stderr غير موجودين (وسيعرض CX_Freeze Win32Gui.exe كوب نافذة خطأ). هذا ألم عندما تريد أن يكون برنامجك قادرًا على التشغيل في وضع واجهة المستخدم الرسومية ووضع خط الأوامر. لتعطيل إخراج وحدة التحكم بأمان ، قم على النحو التالي في بداية البرنامج:

try:
    sys.stdout.write("\n")
    sys.stdout.flush()
except IOError:
    class dummyStream:
        ''' dummyStream behaves like a stream but does nothing. '''
        def __init__(self): pass
        def write(self,data): pass
        def read(self,data): pass
        def flush(self): pass
        def close(self): pass
    # and now redirect all default streams to this dummyStream:
    sys.stdout = dummyStream()
    sys.stderr = dummyStream()
    sys.stdin = dummyStream()
    sys.__stdout__ = dummyStream()
    sys.__stderr__ = dummyStream()
    sys.__stdin__ = dummyStream()

وبهذه الطريقة ، إذا بدأ البرنامج في وضع أقل وحدة تحكم ، فسيعمل حتى إذا كان الرمز يحتوي على عبارات طباعة. وإذا تم تشغيله في وضع سطر الأوامر ، فسيتم طباعته كالمعتاد. (هذا هو في الأساس ما فعلته في WebGobbler أيضًا.)

نصائح أخرى

كتب ريموند تشن عن هذا: http://blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx. باختصار ، ليس من الممكن مباشرة تحت Windows ولكن هناك بعض الحلول.

أود أن أقترح شحن اثنين من التنفيذيين - CLI و GUI ONE.

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