Tôi đã viết một ứng dụng tiện ích nhỏ sử dụng Python 3 (testcase bên dưới cũng hoạt động trong Python 2, tuy nhiên) và PyQt 4 sử dụng mô-đun code
để sinh ra một dấu nhắc REPL cho phép tương tác với một cửa sổ Qt.Thiết bị đầu cuối ở trạng thái bị hỏng (văn bản vô hình/không có tiếng vang) sau khi thoát() trong khi nhập()/raw_input()
Đáng tiếc là tôi đã trúng một vấn đề tôi đã không thể giải quyết: Khi tôi exit()
các ứng dụng trong khi code
là bên trong input()
(được gọi là raw_input()
bằng Python 2.x), thiết bị đầu cuối Linux của tôi sau đó không có tiếng vang còn gõ ký tự. I E. các thiết bị đầu cuối dường như còn lại trong một trạng thái bị hỏng, có lẽ do một số chuỗi thoát được phát hành bởi input()
.
Tôi đã thử nhiều cách tiếp cận để sửa lỗi này, từ việc sử dụng các mô-đun curses
và phương tiện khác để thiết lập lại các thiết bị đầu cuối trước khi chạy exit
, để cố gắng thi đua các stdin
suối để thoát bởi thực tế bàn giao exit()
đến đầu vào() (unfornunately code.InteractiveConsole.push()
không hoạt động theo cách đó, như người ta có thể nghĩ rằng nó sẽ), để cố gắng để viết riêng của tôi không bị chặn input()
sử dụng threading
, nhưng tôi đã không thể kéo cùng một cái gì đó làm việc.
Here, here, here và here là các cuộc thảo luận về các sự cố tương tự.
Cuối cùng, đây là một testcase giảm để chứng minh vấn đề:
#!/usr/bin/env python3
import code
import sys
from PyQt4.QtGui import QApplication, QWidget
app = QApplication(sys.argv)
app.lastWindowClosed.connect(exit)
widget = QWidget()
widget.show()
code.interact()
Đối với những người không quen với (Py) Qt, điều này sẽ mở ra một cửa sổ trống, và khi nó được đóng lại, kết nối từ app
' s lastWindowClosed
tín hiệu sẽ gây ra một cuộc gọi đến được xây dựng trong exit()
chức năng xảy ra. Điều này xảy ra trong khi mô-đun code
đang thực hiện cuộc gọi đến input()
để đọc từ sys.stdin
. Và ở đây, khi tôi đóng cửa sổ, nhập vào thiết bị đầu cuối sau đó không hiển thị bất kỳ ký tự kiểu nào.
Tôi chủ yếu sử dụng Python 3 và ứng dụng thực tế sử dụng mã Python 3 cụ thể, nhưng tôi cũng đã thử testcase trong Python 2.7 và cho thấy cùng một vấn đề.
tôi không thể tái tạo các vấn đề trong win7 64bit python26. Nếu tôi đóng khung qt, giao diện điều khiển sẽ mang lại dấu nhắc bình thường và tôi có thể nhập văn bản trên đó. – joaquin
Tôi nên đề cập rằng tôi đang chạy trên Linux (tôi sẽ chỉnh sửa để đề cập đến điều đó). Hành vi của thiết bị đầu cuối có thể khác nhau đáng kể giữa các nền tảng. Cảm ơn bạn đã kiểm tra! – Sho