Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2019, 16:22   #1
25-й кадр
Человек
Форумчанин
 
Регистрация: 04.04.2011
Сообщений: 178
Вопрос python3 pyqt5 gui terminal

Здравствуйте, форумчане!

Стоит задача написать собственный "терминал" со своими командами используя возможности Qt.
В Qt Designer сделал интерфейс. В groupBox "Консоль" вставил виджет textEdit. Чтобы понять механику выполнения этой задачи, пытаюсь подружить с действием по нажатию на клавишу Enter.

Код:
#System library
import cv2
import numpy as np
import os
import socket
import sys
import time
import threading

#Qt library
from PyQt5 import QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtQuick import *

#Interface files
from interface_server import *

class Server_Window(QtWidgets.QMainWindow):

    def __init__(self):
        super().__init__()
        self.ui_server = Ui_Server_Window()
        self.ui_server.setupUi(self)

        self.ui_server.consoleEdit.installEventFilter(MyFilter(self.ui_server.consoleEdit))
        self.show()

class MyFilter(QtCore.QObject):
    def __init__(self, parent = None):
        QtCore.QObject.__init__(self, parent)
    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.KeyPress:
            if event.key() == QtCore.Qt.Key_Return:
                print('a') #при нажатии на Enter печатается 'a' в терминале IDE
                return False
        return False

app = QtWidgets.QApplication(sys.argv)
sw = Server_Window()

sys.exit(app.exec_())
Может быть, кто-то пытался сделать подобное или может подсказать какие-то расширенные возможности Qt.
В прокомментированной строке "print('a') #при нажатии на Enter печатается 'a' в терминале IDE" хочу понять, как вывести символ не в терминал IDE, а в textEdit. Дальше, думаю, смогу разобраться как и с чем работать.
Нашёл пример подобного на C#, но там делается уже само консольное приложение.

https://www.youtube.com/watch?v=8jUEYYIOFng

У меня же графческий интерфейс и в нём нужно сделать собственный "терминал".
Буду признателен за любую помощь, спасибо!
Изображения
Тип файла: png gui terminal.png (5.6 Кб, 129 просмотров)
Это вам не это
25-й кадр вне форума Ответить с цитированием
Старый 10.04.2019, 14:11   #2
25-й кадр
Человек
Форумчанин
 
Регистрация: 04.04.2011
Сообщений: 178
По умолчанию

Здравствуйте снова!
Собственно, по проблеме...
Нашёл статейку на хабре:
https://habr.com/ru/post/122831/

Попытался перенести код на python.

Код:
from PyQt5 import QtWidgets

class Console(QtWidgets.QPlainTextEdit):
    promt = 'console >_ '
    history = []
    historyPos = 0
    insertPromt = False
    isLocked = False

    def console(self, event):

        if bool(insertNewBlock):
            textCursor().insertBlock()
        textCursor().insertText(promt)

        if event.type() == QtCore.QEvent.MouseButtonPress:
            QtCore.QEvent.MouseButtonPress.setFocus()

        if event.type() == QtCore.QEvent.KeyPress:

            if isLocked:
                return

            if ((event.key() >= 0x20 and event.key() <= 0x7e) and (
                    event.modifiers() == Qt.NoModifier or event.modifiers() == Qt.ShiftModifier())):
                QPlainTextEdit.keyPressEvent(event)

            if ((event.key() == QtCore.Qt.Key_Backspace) and (event.modifiers() == Qt.NoModifier) and (
                    QTextCursor.positionInBlock() > len(promt))):
                QPlainTextEdit.keyPressEvent(event)

            if ((event.key() == QtCore.Qt.Key_Return) and (event.modifiers() == Qt.NoModifier)):
                self.onEnter()

            if event.key() == QtCore.Qt.Key_Up and event.modifiers() == Qt.NoModifier:
                historyBack()

            if event.key() == QtCore.Qt.Key_Down and event.modifiers() == Qt.NoModifier:
                historyForward()

    def onEnter(self):
        if textCursor().positionInBlock() == len(promt):
            insertPromt()
            return
        cmd = textCursor().block().text().mid(len(promt))
        self.isLocked = True
        historyAdd(cmd)
        onCommand.emit(cmd)

    def output(self, s=''):
        textCursor().insertBlock()
        textCursor().insertText(s)
        insertPromt()
        self.isLocked = False

    def historyAdd(self, cmd):
        history.append(cmd)
        self.historyPos = len(history)

    def historyBack(self):
        if (not history_cmd_Pos):
            return
        cursor = QTextCursor
        cursor.movePosition(QTextCursor.StartOfBlock)
        cursor.movePosition(QTextCursor.EndOfBlock, QTextCursor.KeepAnchor)
        cursor.removeSelectedText()
        cursor.insertText(prompt + history.at(self.historyPos - 1))
        setTextCursor(cursor)
        self.historyPos -= 1

    def historyForward(self):

        if self.historyPos == len(history):
            return

        cursor = QTextCursor
        cursor.movePosition(QTextCursor.StartOfBlock)
        cursor.movePosition(QTextCursor.EndOfBlock, QTextCursor.KeepAnchor)
        cursor.removeSelectedText()
        if (self.historyPos == len(history) - 1):
            cursor.insertText(prompt)
        else:
            cursor.insertText(prompt + history.at(self.historyPos + 1))
        setTextCursor(cursor)
        self.historyPos += 1
Перевод, конечно, не идеальный...
Подскажите, направьте в нужное русло.
Спасибо!
Это вам не это
25-й кадр вне форума Ответить с цитированием
Старый 17.04.2019, 13:54   #3
25-й кадр
Человек
Форумчанин
 
Регистрация: 04.04.2011
Сообщений: 178
По умолчанию

Подскажите пожалуйста, как реализовать на Python в этом пункте статьи: "При вводе команды мы вырезаем кусок текста от строки приглашения до конца текстового блока и испускаем сигнал, к которому можно будет присоединить слот:"
вот этот код:
Код:
QString cmd = textCursor().block().text().mid(prompt.length());
emit onCommand(cmd);
Это вам не это
25-й кадр вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Python3 АнтонПинигин Помощь студентам 7 22.08.2017 18:38
Terminal редактирование файла ArrowSoft Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 1 02.07.2015 18:47
Аналоги Terminal Server Foxter_stav Софт 3 29.09.2014 07:08
Программа terminal.exe не запускается Dimka-novitsek Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 15 19.02.2014 15:06
Текст в формате Terminal Dunpeal Общие вопросы Delphi 1 19.12.2007 08:17