Форум сайта python.su
Делаю некое приложение состоящее из основного окна и QTabWidget в котором каждый tab это клас на основе QTextEdit.
Суть в запуске этим приложением дочерних *.exe и *.py файлов и перенаправлением вывода в свой тектсовой виджет.
WinXp,Python 2.6.2.
столкнулся со следующими проблемами: (в коде указаны комментариями #FIXME:)
1) считывание вывода получается в случае с *.exe файлами происходит кусками, в случае с *.py скриптами вывод вообще не происходит.(в обоих случаях это простой ежесекудный вывод строк на станд.уст.вывода)
Стоит отметить что если в *.py скрипте заменить print some на sys.stdout.write(some);sys.stdout.flush(); то все будет работать как надо.
2)В случае с *.exe текст в текстовом виджете прорисовывается кусками (до тех пор пока его не выделишь). Метод repaint() не помог.
возможно с этим связанно сообщение интерпретатора:
QObject::connect: Cannot queue arguments of type ‘QTextCursor’
(Make sure ‘QTextCursor’ is registered using qRegisterMetaType().)
3)При закрытии приложения нужно закрыть все запущенные процессы. Однако на практике получается закрыть только последний запущенный, в остальных случаях вылазиет ошибка WinError 5.
Прошу помогите мне во всем разобраться и исправить ошибки.
Основной код:
#-*- coding: cp1251 -*-
ru=lambda x: unicode(x)
import time,sys,thread,subprocess,os
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class MyText(QTextEdit):
def __init__(self,paramStr):
super(MyText,self).__init__()
thread.start_new_thread(self.lookIt,(paramStr,))
def lookIt(self,paramStr):
self.childProcess=subprocess.Popen(paramStr,stdout=subprocess.PIPE)
while True:
str=self.childProcess.stdout.readline() #FIXME: 1
if not str:
print 'break happen on pid',self.childProcess.pid
break
self.append(unicode(str.rstrip())) #FIXME: 2
class Main(QMainWindow):
def __init__(self):
super(Main,self).__init__()
self.tab=QTabWidget(self)
self.tab.setTabsClosable(True)
self.connect(self.tab, SIGNAL('tabCloseRequested(int)'),self.tabClose)
self.sb=self.statusBar()
self.sb.showMessage('start',1000)
self.actionOpen=QAction(ru('Открыть'),self)
self.connect(self.actionOpen, SIGNAL('triggered()'),self.actionLaunch)
self.menu=self.menuBar()
self.menu.addAction(self.actionOpen)
self.setCentralWidget(self.tab)
self.setGeometry(150,150,640,480)
def actionLaunch(self):
#TODO: выбор файла
i=self.tab.addTab(MyText('python one.py'), 'python - one.py')
self.tab.setCurrentIndex(i)
def tabClose(self,index):
try:
if self.tab.currentWidget().childProcess.poll()==None:
self.tab.currentWidget().childProcess.terminate() #FIXME: 3
self.tab.removeTab(index)
except Exception,e: # на всякий случай так
print sys.exc_info(),'\n',e
def closeEvent(self,QCloseEvent):
for tabIndex in xrange(self.tab.count()):
self.tabClose(0)
QCloseEvent.accept()
app=QApplication(sys.argv)
form=Main()
form.show()
app.exec_()
import time,sys
print '\nStart'
i=0
while True:
i+=1
print i
time.sleep(1)
print 'End'
Офлайн
по поводу 1) *.py
из соседней ветки выяснено, что нужно интерпретатор питона вызывать с ключом -i
Офлайн
методом случайного тыка решил проблему 3):
self.tabClose(self.tab.currentIndex())
Офлайн