0

Всем привет,Есть GUI оболочка и при нажатии на кнопку "Search", должна запускаться программа из другого файла(программа строит граф прохода по уязвимостям сети). При импорте, запускается сама программа, без оболочки.. Перечитала много форумов, но ответа толком не нашла.. С PyQt5 работаю в первый раз.. очень нужна ваша помощь

import sys
from PyQt5.QtWidgets import (QMainWindow, QApplication, QLineEdit, QDesktopWidget, QMessageBox, QToolTip, QPushButton,
                             QAction, QLabel, QGridLayout, QWidget, QHBoxLayout, QVBoxLayout)
from PyQt5.QtGui import QIcon, QFont
import run #это и есть та функция

class MyMainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MyMainWindow, self).__init__(parent)
        self.form_widget = FormWidget(self)
        self.setCentralWidget(self.form_widget)

        exitAction = QAction(QIcon('exit.png'), '&Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit')
        exitAction.triggered.connect(self.closeEvent)
        self.statusBar()
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)

        exitAction = QAction(QIcon('exit.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(self.closeEvent)

        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAction)

        self.resize(500, 300)
        self.center()
        self.setWindowTitle('Spider')
        self.setWindowIcon(QIcon('1.png'))
        self.show()

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def closeEvent(self, event):
        reply = QMessageBox.question(self, 'Exit', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No,
                                     QMessageBox.No)
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        QToolTip.setFont(QFont('SansSerif', 10))
        name = QLabel('Selected files:')
        file_vulnerability = QLabel('File vulnerability:')
        link_file = QLabel('Link file:')
        network_topology = QLabel('Network topology:')
        start_ip = QLabel('Start IP:')
        file_vulnerabilityEdit = QLineEdit()
        link_fileEdit = QLineEdit()
        network_topologyEdit = QLineEdit()
        start_ipEdit = QLineEdit()
        browse_1 = QPushButton("Browse", self)
        browse_2 = QPushButton("Browse", self)
        browse_3 = QPushButton("Browse", self)
        search = QPushButton("Search", self)
        grid = QGridLayout()
        grid.setSpacing(10)
        grid.addWidget(name, 1, 0)
        grid.addWidget(file_vulnerability, 2, 0)
        grid.addWidget(file_vulnerabilityEdit, 2, 1)
        grid.addWidget(browse_1, 2, 2)
        grid.addWidget(link_file, 3, 0)
        grid.addWidget(link_fileEdit, 3, 1)
        grid.addWidget(browse_2, 3, 2)
        grid.addWidget(network_topology, 4, 0)
        grid.addWidget(network_topologyEdit, 4, 1)
        grid.addWidget(browse_3, 4, 2)
        grid.addWidget(start_ip, 5, 0)
        grid.addWidget(start_ipEdit, 5, 1)
        grid.addWidget(search, 5, 2)

        self.setLayout(grid)
        self.show()

        search.clicked.connect(self.buttonClicked)

    def buttonClicked(self):
        run() 


if __name__ == '__main__':
    app = QApplication(sys.argv)
    foo = MyMainWindow()
    foo.show()
    sys.exit(app.exec_())
jfs
  • 52,361
Darkness
  • 103
  • run это не функция, а модуль,который импортируется. В самом модуле есть код вне if __name__ == '__main__':, который и выполняется при импортировании, а так заголовок вопроса некорректен -- сигнал кнопки соединен с функцией buttonClicked, которая выполняется при клике – gil9red May 01 '17 at 21:29
  • @gil9red не совсем поняла.. – Darkness May 01 '17 at 21:30
  • я про import run. import <name> импортирует модуль (файл .py). Почитайте больше об этом в питоне – gil9red May 01 '17 at 21:31
  • @gil9red если я напишу вот так ничего не меняется from run import run – Darkness May 01 '17 at 21:34
  • Я не знаю, что у вас в файле run.py находится, поэтому не могу сказать правильно ли вы делаете импорт. Замените run() в buttonClicked на print("click") и проверьте что после клика в консоли выводится, после можно разобраться что не так с run :) – gil9red May 01 '17 at 21:36
  • @gil9red если в функции что-то принтовать, все работает, я добавила код импорта.. – Darkness May 01 '17 at 21:37
  • В конце run.py торчит run(). При импортировании вызывается весь код, что не входит в if __name__ == '__main__':, поэтому run() и вызывался, понятно? – gil9red May 01 '17 at 21:40
  • @gil9red Ты чудо, спасибо большое) – Darkness May 01 '17 at 21:41
  • В сторону: не обязательно buttonClicked() метод определять, который run() вызывает. Вы можете просто run функцию как есть передать в Питоне: search.clicked.connect(run). – jfs May 01 '17 at 21:58

0 Answers0