繁体   English   中英

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

[英]Python script stops running when I import a GUI python script

我有一个 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。

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

尝试一下:

主文件

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_())

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM