2

So I've been trying to create my own terminal but that has been proven very glitchy and not professional looking.

Then I stumbled across this code which is for PyQt4:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *


class embterminal(QWidget):

    def __init__(self):
        QWidget.__init__(self)
        self.process = QProcess(self)
        self.terminal = QWidget(self)
        layout = QVBoxLayout(self)
        layout.addWidget(self.terminal)
        #self.process.start(
                #'xterm',['-into', str(self.terminal.winId())])
        # Works also with urxvt:
        self.process.start(
                'urxvt',['-embed', str(self.terminal.winId())])


if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = embterminal()
    main.show()
    sys.exit(app.exec_())

Since my application is written in PyQt5, I naturally tried porting that code to PyQt5. I changed from PyQt4.QtCore import * from PyQt4.QtGui import * to from PyQt5.QtCore import * from PyQt5.QtGui import * and added from PyQt5.QtWidgets import *

Then when I ran my code I realized the terminal didn't pop up.

I wonder why does this happen and is there a workaround ?

I also wonder if I can use both PyQt5 and PyQt4 in the same project/file, even.

ekhumoro
  • 115,249
  • 20
  • 229
  • 336

1 Answers1

3

In PyQt. QWidget.winId() returns a sip.voidptr object, but if you convert it to an integer, it should work. Here's a working example:

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.process = QProcess(self)
        self.terminal = QWidget(self)
        layout = QVBoxLayout(self)
        layout.addWidget(self.terminal)
        wid = str(int(self.terminal.winId()))
        self.process.start('urxvt', ['-embed', wid])

    def closeEvent(self, event):
        self.process.terminate()
        self.process.waitForFinished(1000)

if __name__ == "__main__":

    app = QApplication(sys.argv)
    window = Window()
    window.setGeometry(100, 100, 800, 600)
    window.show()
    sys.exit(app.exec_())
ekhumoro
  • 115,249
  • 20
  • 229
  • 336
  • I get a simple gui with no option in it. Is it normal ? How can I get a normal terminal inside my PyQt5 app ? – node_analyser Sep 11 '18 at 06:29
  • Is it possible to resize embTerminal on any resizeEvent (self.resizeEvent if there's no parent, or parent.resizeEvent if it's in some container) ? – Dušan Atanacković Feb 11 '19 at 12:41
  • I also had that problem and this is the main reason I've started developing my own terminal widget https://github.com/Fuchsiaff/PyQtTerminal –  Feb 13 '19 at 22:04
  • I had a look to your code, but there is no usage info (I left an "Issue"); how is it supposed to be used? – ZioByte Aug 06 '19 at 10:15