2017-10-09 126 views
0

我有一個接口Arduino的問題。我可以通過一個簡單的程序與Arduino進行通信,例如讀取數據並寫入它們。我已用PyQt5來控制伺服電機創造了一個接口和I得到的錯誤:Pyqt5接口Arduino伺服ErrorType「對象沒有屬性」ser'「

'Ui_MainWindow' object has no attribute 'ser'

我使用的代碼是:

from PyQt5 import QtCore, QtGui, QtWidgets 
import serial 
import time 
import sys 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow, ser): 

     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(318, 309) 
     self.centralwidget = QtWidgets.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 

     self.pushButton = QtWidgets.QPushButton("pushButton", self.centralwidget) 
     self.pushButton.setGeometry(QtCore.QRect(120, 40, 85, 27)) 
     self.pushButton.clicked.connect(self.OpenShutter) 

     self.pushButton_2 = QtWidgets.QPushButton("pushButton_2", self.centralwidget) 
     self.pushButton_2.setGeometry(QtCore.QRect(120, 150, 85, 27)) 
     self.pushButton_2.clicked.connect(self.CloseShutter) 

     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtWidgets.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 318, 20)) 
     self.menubar.setObjectName("menubar") 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtWidgets.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("statusbar") 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     _translate = QtCore.QCoreApplication.translate 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 
     self.pushButton.setText(_translate("MainWindow", "Open")) 
     self.pushButton_2.setText(_translate("MainWindow", "Close")) 

    def CloseShutter(self): 
     print("Shutter Closed") 
     self.ser.write(int(0)) 



    def OpenShutter(self): 
     print("Shutter Opened") 
     self.ser.write(int(77)) 


if __name__ == "__main__": 
    ser = serial.Serial() 
    ser.port = '/dev/ttyACM0' 
    ser.timeout = 1 
    ser.baudrate = 9600 
    if ser.isOpen() == False: 
     ser.open() 
    app = QtWidgets.QApplication(sys.argv) 
    MainWindow = QtWidgets.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow, ser) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

回答

0

的問題是,ser不是類的成員所以它只會存在於方法的上下文中,而不存在於類的上下文中。

最值得推薦的是不要修改設計並創建一個實現邏輯的類,並在該類中爲串行對象創建一個類的成員。所以我建議不要修改Ui_MainWindow類並將其恢復到初始狀態。

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     QtWidgets.QMainWindow.__init__(self, parent) 
     self.setupUi(self) 

     self.ser = serial.Serial() 
     self.ser.port = '/dev/ttyACM0' 
     self.ser.timeout = 1 
     self.ser.baudrate = 9600 
     if self.ser.isOpen() == False: 
      self.ser.open() 

    def CloseShutter(self): 
     print("Shutter Closed") 
     self.ser.write(int(0)) 

    def OpenShutter(self): 
     print("Shutter Opened") 
     self.ser.write(int(77)) 


if __name__ == "__main__": 
    app = QtWidgets.QApplication(sys.argv) 
    w = MainWindow() 
    w.show() 
    sys.exit(app.exec_()) 
+0

非常感謝eyllanesc,它按照你的建議工作:) – LdOmar