2010-05-21 19 views
6

Tôi đã phát triển một ứng dụng Python chạy cả trong chế độ GUI và chế độ bảng điều khiển. Nếu bất kỳ đối số nào được chỉ định, nó sẽ chạy trong một chế độ console khác nó chạy trong chế độ GUI.Làm thế nào tôi có thể đóng băng ứng dụng chế độ kép (GUI và giao diện điều khiển) bằng cx_Freeze?

Tôi đã quản lý việc này bằng cách sử dụng cx_Freeze. Tôi đã có một số vấn đề ẩn cửa sổ giao diện điều khiển màu đen đó sẽ bật lên với wxPython và vì vậy tôi sửa đổi setup.py kịch bản của tôi như thế này:

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)]) 

này hoạt động tốt nhưng bây giờ khi tôi cố gắng để mở ra giao diện điều khiển của tôi và chạy file thực thi từ ở đó, nó không xuất ra bất cứ thứ gì. Tôi không nhận được bất kỳ lỗi hoặc tin nhắn để có vẻ như là cx_Feeze đang chuyển hướng stdout ở một nơi khác.

Có thể làm cho thiết bị hoạt động với cả hai chế độ không? Không có gì tương tự như điều này dường như được tài liệu bất cứ nơi nào. . :(

Cảm ơn trước

Mridang

Trả lời

13

Tôi tìm thấy bit này trên this trang:

Mẹo cho các phiên bản console-less: Nếu bạn cố gắng in bất cứ điều gì, bạn sẽ nhận được một cửa sổ lỗi khó chịu, bởi vì stdout và stderr không tồn tại (và các cx_freeze Win32gui.exe còn sơ khai sẽ hiển thị một lỗi Cửa sổ). Đây là một cơn đau khi bạn muốn chương trình của mình là có thể chạy ở chế độ GUI và chế độ dòng lệnh. Để vô hiệu hóa console đầu ra một cách an toàn, làm như sau tại đầu chương trình của bạn:

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() 

Bằng cách này, nếu chương trình bắt đầu trong chế độ console-ít hơn, nó sẽ làm việc thậm chí nếu mã chứa các câu lệnh in. Và nếu chạy ở chế độ dòng lệnh, nó sẽ in ra như bình thường. (Đây là về cơ bản những gì tôi đã làm trong webGobbler, cũng vậy.)

+0

Tôi đã đặt đoạn mã này vào mã của mình, nhưng tôi vẫn gặp lỗi. Điều này có thể liên quan đến việc sử dụng colorama trong mã của tôi, một thư viện xuất ra văn bản màu. Bạn có biết cách sửa lỗi này không? Tôi đã thêm [ảnh chụp màn hình] (http://i.imgur.com/1zVKo0c.png) để làm rõ lỗi. Hy vọng bạn có thể giúp tôi. –

2

Raymond Chen đã viết về vấn đề này:.. http://blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx Nói tóm lại, đó là không thể thực hiện trực tiếp trong môi trường Windows nhưng có một số cách giải quyết

Tôi muốn đề nghị vận chuyển hai tập tin thực thi - số cli và gui

+0

Tôi đã tìm được cách giải quyết như người được đề cập trong bài đăng của anh ấy. Nhìn vào câu trả lời của tôi dưới đây. –

Các vấn đề liên quan