Найти - Пользователи
Полная версия: pyqt4 вывод
Начало » GUI » pyqt4 вывод
1
sanodin
Здравствуйте,нужен простой пример , который выводит результат работы скрипта, в гуи окно
while True:
    v=raw_input(": ")
    print v
Заранее спасибо
reclosedev
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import subprocess
 
from PyQt4 import QtCore, QtGui
 
 
class ProcessCommunicationThread(QtCore.QThread):
 
    new_data_available = QtCore.pyqtSignal(str)
    process_terminated = QtCore.pyqtSignal()
 
    def __init__(self, process_args, encoding='cp866', parent=None):
        QtCore.QThread.__init__(self, parent)
        self._process_args = process_args
        self._pipe = None
        self._encoding = encoding
 
    def run(self):
        p = subprocess.Popen(
            self._process_args, bufsize=1, stdin=subprocess.PIPE,
            stdout=subprocess.PIPE, stderr=subprocess.PIPE
        )
        self._pipe = p
        while True:
            data = p.stdout.read(1)
            if not data:  # EOF
                break
            self.new_data_available.emit(data.decode(self._encoding))
        self.process_terminated.emit()
        self._pipe = None
 
    def write_data(self, data):
        if self._pipe:
            self._pipe.stdin.write(data.encode(self._encoding))
            self._pipe.stdin.flush()
            self.new_data_available.emit(data)
 
 
class MainWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        layout = QtGui.QVBoxLayout(self)
        self.input_widget = QtGui.QLineEdit(returnPressed=self._on_edit_return_pressed)
        self.output_widget = QtGui.QPlainTextEdit(readOnly=True)
        layout.addWidget(self.input_widget)
        layout.addWidget(self.output_widget)
 
        thread = ProcessCommunicationThread(['python', 'some_program.py'])
        thread.new_data_available.connect(self.add_output_text)
        thread.process_terminated.connect(
            lambda : self.add_output_text('Process terminated\n')
        )
        self._ps_thread = thread
        thread.start()
 
    def _on_edit_return_pressed(self):
        self._ps_thread.write_data(u'%s\n' % self.input_widget.text())
        self.input_widget.setText('')
 
    def add_output_text(self, data):
        self.output_widget.moveCursor(QtGui.QTextCursor.End)
        self.output_widget.insertPlainText(data)
 
 
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    wnd = MainWindow()
    wnd.resize(480, 480)
    wnd.show()
    sys.exit(app.exec_())
sanodin
Помог,спасибо, то что надо.


reclosedev
sanodin
только окно запускается постоянно.
Какое окно, запускаемой программы? Странно, какая ос и Python, случайно не 64 битные?

Если Win, можно вот так попробовать:
si = subprocess.STARTUPINFO()
si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW
si.wShowWindow = subprocess.SW_HIDE
p = subprocess.Popen(
    self._process_args, bufsize=1, stdin=subprocess.PIPE,
    stdout=subprocess.PIPE, stderr=subprocess.PIPE,
    startupinfo=si
)
sanodin
Там все нормально работает,я сам не тот файл запускал,работает отлично,но
еще узнать надо,если переменная v уже определена,допустим
while True:
    v = u"привет"
    print v
просто вывод print в окно
reclosedev
sanodin
Там все нормально работает,я сам не тот файл запускал,работает отлично,но
еще узнать надо,если переменная v уже определена,допустим
while True:
    v = u"привет"
    print v
просто вывод print в окно
Не совсем понял про переменную. Если программа выводит данные построчно, тогда можно читать целыми строками с помощью p.stdout.readline() и bufsize лучше по умолчанию оставить. Если же построчный вывод не нужен, а нужен только результат программы, то лучше p.communicate() использовать (можно и без потоков).
Если бы написали для чего конкретно это нужно, было бы проще советовать.
sanodin
Сам скрипт работает в цикле,переменная v принимает всегда вид строки,
def voice():
    ....
def speech():
    ....
while 1:
    print 'начало работы программы'
    v='привет'
    if v=='привет': 
        print 'здравствуйте'
        speech.say(u'здравствуйте')
    ....
переменная v после каждого цикла принимает новое значение, но принтов несколько и надо что бы по ходу выполнения программы в окне отображались все принты по очереди
переменная обновляется из другой функции ,без нажатий клавиш . Программа работает с помощью голосового общения,переменная v результат возврата распознавания голоса,сама программа рабочая ,лезет в нет при просьбе рассказать погоду или новости или анекдот, если скажешь команду-выполнит,ответит…но простой гуй прикрутить хочется , а в этом я не соображаю
reclosedev
Получается, что скрипт вызывать вообще не надо, просто хочешь существующий с консольным интерфейсом переписать на GUI?
Тогда лучше туториал полистать, потому что захочется сделать по своему и добавить что-то еще.
sanodin
reclosedev
Получается, что скрипт вызывать вообще не надо, просто хочешь существующий с консольным интерфейсом переписать на GUI?
Тогда лучше туториал полистать, потому что захочется сделать по своему и добавить что-то еще.

Четвертый день листаю…и гугл красный уже…мне пример нужен,с ним работать и буду, и добавлять свое и переделывать..мне так легче…
Попадались примеры где либо просто окно либо с кучей кнопок и всякой ерунды,там черт ногу сломит, биндить надо и тд и тп

Вот с Вашим примером и работаю…)))
Понимание приходит…и туториалы конечно листаю..
Спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB