导入GUI python脚本时,Python脚本停止运行

时间:2019-02-13 22:15:10

标签: python pyqt5

我有一个PyQt5脚本,该脚本创建了一个包含滑块的窗口。我希望在主要python脚本中使用此滑块的值,但是当它运行时,GUI脚本会连续运行,而主要python脚本根本不会运行。

我已经在GUI python脚本中创建了一个简单的滑块,然后将此脚本导入到主python文件中。

我的GUI python文件是:

import sys
from PyQt5.QtWidgets import (QLineEdit, QSlider, QPushButton, 
QVBoxLayout, QApplication, QWidget)
from PyQt5.QtCore import Qt

class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()

        self.init_ui()

    def init_ui(self):
        self.s1 = QSlider(Qt.Horizontal)
        self.s1.setMinimum(1)
        self.s1.setMaximum(100)
        self.s1.setValue(25)
        self.b1 = QPushButton('Run')

        v_box = QVBoxLayout()
        v_box.addWidget(self.s1)
        v_box.addWidget(self.b1)

        self.setLayout(v_box)

        self.b1.clicked.connect(self.run_script)

        self.show()

    def run_script(self):
        return self.s1.value()

app = QApplication(sys.argv)
a_window = Window()
sys.exit(app.exec_())

然后,我想从滑块中获取值并在我的主要python脚本中使用,其简化版本为:

from gui_script.py import * 

value = 10 + self.s1.value()
print(value)

由此我得到滑块值,但是10并未添加到滑块值,这意味着主python文件未运行。输入滑块值后,如何使主python文件正确运行?

如果将滑块值设置为10,我希望该值为20。

2 个答案:

答案 0 :(得分:0)

我冒昧地猜测您的GUI脚本正在调用.mainloop()或某些等效命令并进入阻塞循环。这只是猜测,尽管您无需发布任何相关代码...假设这是问题所在,您也许可以通过线程或多处理来规避它。

答案 1 :(得分:0)

尝试一下:

main.py

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

# from gui_script.py import *                     # ---
from gui_script import Slider                     # +++

class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.slider = Slider()                    # +++
        self.slider.s1.valueChanged[int].connect(self.changeValue)

        self.spinBox = QSpinBox(self)
        self.spinBox.setMinimum(1)
        self.spinBox.setMaximum(100)
        self.spinBox.setValue(25)
        self.spinBox.valueChanged.connect(self.valueChangedSpin)

        lay = QVBoxLayout(self)
        lay.addWidget(self.slider)
        lay.addWidget(self.spinBox)

    def valueChangedSpin(self, i):
        self.slider.s1.setValue(i)

    def changeValue(self, value):                               
        self.spinBox.setValue(value)


if __name__ == '__main__':                        
    app = QApplication(sys.argv)
    mainwindow = Window()
    mainwindow.show()
    sys.exit(app.exec_())

gui_script.py

import sys
from PyQt5.QtWidgets import (QLineEdit, QSlider, QPushButton, 
                             QVBoxLayout, QApplication, QWidget, QLabel)
from PyQt5.QtCore    import Qt

class Slider(QWidget):
    def __init__(self):
        super().__init__()

        self.init_ui()

    def init_ui(self):
        self.label = QLabel("25")

        self.s1 = QSlider(Qt.Horizontal)
        self.s1.setMinimum(1)
        self.s1.setMaximum(100)
        self.s1.setValue(25)
        self.s1.valueChanged[int].connect(self.changeValue)    

        self.b1 = QPushButton('Run')
        self.b1.clicked.connect(self.run_script)

        self.v_box = QVBoxLayout()
        self.v_box.addWidget(self.label)
        self.v_box.addWidget(self.s1)
        self.v_box.addWidget(self.b1)
        self.setLayout(self.v_box)

    def run_script(self):
#        return self.s1.value()
        print(self.s1.value())

    def changeValue(self, value):                               
        self.label.setNum(value)  

if __name__ == '__main__':                      # !!!
    app = QApplication(sys.argv)
    a_window = Slider()
    a_window.show()
    sys.exit(app.exec_())

enter image description here