Python 2.7 PyQT4,Python27-串行连接和全局变量

Python 2.7 PyQT4,Python27-串行连接和全局变量,python-2.7,serial-port,pyqt4,Python 2.7,Serial Port,Pyqt4,我认为我的问题很简单,但我遇到了麻烦。我不是一个程序员,但需要一个程序来通过Arduino控制激光雕刻机。我的原始代码基本上正常工作,但我希望能够选择一个带有QComboBox的串行端口,这样我就可以让每个人都可以使用它的软件 我通过下面的代码了解了如何做到这一点: import sys import serial import time import serial.tools.list_ports from PyQt4 import QtGui from window_test import

我认为我的问题很简单,但我遇到了麻烦。我不是一个程序员,但需要一个程序来通过Arduino控制激光雕刻机。我的原始代码基本上正常工作,但我希望能够选择一个带有QComboBox的串行端口,这样我就可以让每个人都可以使用它的软件

我通过下面的代码了解了如何做到这一点:

import sys
import serial
import time
import serial.tools.list_ports
from PyQt4 import QtGui
from window_test import Ui_MainWindow


class Main(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.btn_laser_poweron.clicked.connect(self.btnFIRE)
        self.ui.btn_laser_poweroff.clicked.connect(self.btnOFF)
        self.ui.btn_lig_power.clicked.connect(self.btnLIG)
        self.ui.btn_cutting_power.clicked.connect(self.btnCUT)
        self.ui.btn_power_meter.clicked.connect(self.btnTEST)
        self.ui.spinBox.valueChanged.connect(self.PwrLevel)
        self.ui.comboBox.activated.connect(self.srlprt)


    def srlprt(self):
        serial.Serial(str(self.ui.comboBox.currentText()))
    def btnFIRE(self):
        ser.write("a" + chr(255))
    def btnOFF(self):
        ser.write("b" + chr(0))
    def btnTEST(self):
        ser.write("c" + chr(0))
        time.sleep(59.5)
        ser.write("d" + chr(255))
    def btnLIG(self):
        ser.write("e" + chr(29))
    def btnCUT(self):
        ser.write("f" + chr(160))
    def PwrLevel(self):
        val = self.ui.spinBox.value()
        ser.write("g" + chr(val))



if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())
现在我的问题是,我的所有按钮都不起作用,因为“ser”不是全局定义的。我知道当我在类定义之上删除“ser=serial.serial(port=COM3)”时,我破坏了它,但我不知道如何修复它。任何帮助都将不胜感激


干杯

一个简单的解决方案是将
ser
设置为
Main
实例的属性。此外,如果在打开新的串行连接之前串行连接已打开,则关闭串行连接也不会有任何影响,例如:

import sys
import serial
import time
import serial.tools.list_ports
from PyQt4 import QtGui
from window_test import Ui_MainWindow


class Main(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.ser = None
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.btn_laser_poweron.clicked.connect(self.btnFIRE)
        self.ui.btn_laser_poweroff.clicked.connect(self.btnOFF)
        self.ui.btn_lig_power.clicked.connect(self.btnLIG)
        self.ui.btn_cutting_power.clicked.connect(self.btnCUT)
        self.ui.btn_power_meter.clicked.connect(self.btnTEST)
        self.ui.spinBox.valueChanged.connect(self.PwrLevel)
        self.ui.comboBox.activated.connect(self.srlprt)


    def srlprt(self):
        if self.ser:
            self.ser.close()
        self.ser = serial.Serial(str(self.ui.comboBox.currentText()))
    def btnFIRE(self):
        self.ser.write("a" + chr(255))
    def btnOFF(self):
        self.ser.write("b" + chr(0))
    def btnTEST(self):
        self.ser.write("c" + chr(0))
        time.sleep(59.5)
        self.ser.write("d" + chr(255))
    def btnLIG(self):
        self.ser.write("e" + chr(29))
    def btnCUT(self):
        self.ser.write("f" + chr(160))
    def PwrLevel(self):
        val = self.ui.spinBox.value()
        self.ser.write("g" + chr(val))



if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())

self.ser=serial.serial(str(self.ui.comboBox.currentText())
非常感谢您的快速详细回复!!这很有道理,我不敢相信我错过了在主课上设置ser。