2015-07-19 2 views
0

Я создаю интерфейс, состоящий из терминала, встроенного в графический интерфейс PyQt, рядом с ним для запуска команд в этом терминале. Когда я запускаю свой код, я думаю, что части графического интерфейса создаются правильно, но виджет терминала закрыт. Как я могу предотвратить это?Как я могу предотвратить появление виджета PyQt?

import sys 
from PyQt4 import QtCore, QtGui 

class embedded_terminal(QtGui.QWidget): 

    def __init__(self): 

     QtGui.QWidget.__init__(self) 
     self._processes = [] 
     self.resize(800, 800) 

     # set grid layout 

     grid = QtGui.QGridLayout() 

     # layout group for buttons 

     group_buttons = QtGui.QGroupBox() 
     vbox = QtGui.QVBoxLayout() 
     # define buttons 
     button_list = self.command_button(
      title = "ls", 
      command = "ls" 
     ) 
     button_terminate = QtGui.QPushButton("terminate") 
     button_terminate.clicked.connect(lambda: self.terminate()) 
     # style buttons and add buttons to layout 
     buttons = [] 
     buttons.append(button_list) 
     buttons.append(button_terminate) 
     for button in buttons: 
      self.set_button_style(button) 
      vbox.addWidget(button) 
     vbox.addStretch(1) 
     group_buttons.setLayout(vbox) 

     # layout group for terminal 

     group_terminal = QtGui.QGroupBox() 
     group_terminal.setLayout(vbox) 
     vbox = QtGui.QVBoxLayout() 
     # terminal 
     self.terminal = QtGui.QWidget(self) 
     vbox.addWidget(self.terminal) 
     vbox.addStretch(1) 
     group_terminal.setLayout(vbox) 

     # add layout groups to grid layout 
     grid.addWidget(group_buttons, 0, 0) 
     grid.addWidget(group_terminal, 0, 1) 
     self.setLayout(grid) 

     self.start_process(
      "xterm", 
       [ 
        "-fn", 
        "-misc-fixed-*-*-*-*-18-*-*-*-*-*-*-*", 
        "-into", 
        str(self.terminal.winId()), 
        "-e", 
        "tmux", 
        "new", 
        "-s", 
        "session1" 
       ] 
     ) 

    def start_process(
     self, 
     program, 
     options 
     ): 
     child = QtCore.QProcess() 
     self._processes.append(child) 
     child.start(program, options) 

    def run_command(
     self, 
     command = "ls" 
     ): 
     program = "tmux" 
     options = [] 
     options.extend(["send-keys", "-t", "session1:0"]) 
     options.extend([command]) 
     options.extend(["Enter"]) 
     self.start_process(program, options) 

    def command_button(
     self, 
     title = None, 
     command = None 
     ): 
     button = QtGui.QPushButton(title) 
     button.clicked.connect(lambda: self.run_command(command = command)) 
     return button 

    def set_button_style(
     self, 
     button 
     ): 
     # Set button style. 
     button.setStyleSheet(
      """ 
      color: #{color1}; 
      background-color: #{color2}; 
      border: 1px solid #{color1}; 
      """.format(
       color1 = "3861aa", 
       color2 = "ffffff" 
      ) 
     ) 
     # Set button dimensions. 
     button.setFixedSize(
      300, 
      60 
     ) 

    def terminate(self): 
     program = "tmux" 
     options = [] 
     options.extend(["send-keys", "-t", "session1:0"]) 
     options.extend(["killall tmux"]) 
     options.extend(["Enter"]) 
     self.start_process(program, options) 
     QtGui.QApplication.instance().quit() 

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

ответ

1

К сожалению мой английский язык.

У вас есть ошибка: добавьте макет перед его созданием. Таким образом, вы прикрепляете к group_terminal то же самое vbox, которое вы прикрепляли к group_buttons.

# layout group for terminal 
group_terminal = QtGui.QGroupBox() 
group_terminal.setLayout(vbox) # <- old one 
vbox = QtGui.QVBoxLayout() 

Кроме того, Qt ничего не знает о размере вашего xterm окна. Похоже, вы должны указать его вручную. Этот код работает нормально:

group_terminal = QtGui.QGroupBox() 
vbox = QtGui.QVBoxLayout() 
group_terminal.setLayout(vbox) 

# terminal 
self.terminal = QtGui.QWidget() 
self.terminal.setFixedSize(730, 440)