2017-01-08 3 views
0

У меня есть следующий класс Ui_MainWindow (object). Однако я получаю ошибку атрибута, что AttributeError: 'Ui_MainWindow' object has no attribute 'ser' .ser перед defindet в методе check_phone(). Проблема возникает в методе sendMessage(). Почему этот .ser больше не распознается?Ошибка атрибута: объект не имеет атрибута в python

from PyQt5 import QtCore, QtGui, QtWidgets 

    import Tkinter as tk 
    import tkFileDialog as filedialog 
    import tkMessageBox 
    import serial 
    import time 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(503, 486) 
     self.pushButton_2 = QtWidgets.QPushButton(self.widget) 
     self.pushButton_2.setObjectName("pushButton_2") 
     self.gridLayout.addWidget(self.pushButton_2, 3, 2, 1, 1) 
     self.pushButton_2.clicked.connect(self.send_sms) #send sms function 

    def check_phone(self): 
     ser = serial.Serial('/dev/ttyACM0', 
       460800, 
       timeout=5, 
       xonxoff = False, 
       rtscts = False, 
       bytesize = serial.EIGHTBITS, 
       parity = serial.PARITY_NONE, 
       stopbits = serial.STOPBITS_ONE) 

    def sendMessage(self): 
     self.ser.write('ATZ\r') 
     time.sleep(1) 
     self.ser.write('AT+CMGF=1\r') 
     time.sleep(1) 
     self.ser.write('''AT+CMGS="''' + self.recipient + '''"\r''') 
     time.sleep(1) 
     self.ser.write(self.content + "\r") 
     time.sleep(1) 
     self.ser.write(chr(26)) 
     time.sleep(2) 

    def send_sms(self): 
    check = self.radioButton.isChecked() #stuff doesnt work yet! 
    test = self.lineEdit.text() 
    print(test) 
    if check == True: 
     if not self.lineEdit.text(): 
      root = tk.Tk() 
      root.withdraw() 
      tkMessageBox.showwarning("Phone Number Missing!", "Please enter a valid phone number") 
      root.destroy() 
      root.mainloop() 
      return 
     if not self.plainTextEdit.toPlainText(): 
      root = tk.Tk() 
      root.withdraw() 
      tkMessageBox.showwarning("Message Missing!", "Please enter a text message") 
      root.destroy() 
      root.mainloop() 
      return 
     else: 
      sms = Ui_MainWindow(self.lineEdit.text(), self.plainTextEdit.toPlainText()) 
      sms.check_phone() 
      sms.sendMessage() 
      sms.disconnectPhone() 
      self.plainTextEdit2.setText('message sent successfully') 
+2

Ваш отступы выключен, но это довольно ясно, что вы на самом деле не назначить ** '' self.' ** сер 'в методе' check_phone'. Это просто локальная переменная, которая разыменовывается, как только заканчивается вызов метода. – jonrsharpe

ответ

1

Как Джон указывает, вы присваиваете serial.Serial к (скоро отбрасывают) локальной переменной в check_phone, а не к атрибуту экземпляра.

Заменить это:

def check_phone(self): 
    ser = serial.Serial('/dev/ttyACM0', 
      460800, 
      timeout=5, 
      xonxoff = False, 
      rtscts = False, 
      bytesize = serial.EIGHTBITS, 
      parity = serial.PARITY_NONE, 
      stopbits = serial.STOPBITS_ONE) 

С этим:

def check_phone(self): 
    self.ser = serial.Serial('/dev/ttyACM0', 
      460800, 
      timeout=5, 
      xonxoff = False, 
      rtscts = False, 
      bytesize = serial.EIGHTBITS, 
      parity = serial.PARITY_NONE, 
      stopbits = serial.STOPBITS_ONE) 
+0

Большое спасибо. На самом деле это была проблема. На самом деле сер был просто местным! Я этого не видел. – fahrradlaus

+0

@fahrradlaus - принять этот ответ, чтобы мы знали его право на glace .... и Tagc получает 15 блестящих очков для загрузки! – tdelaney

Смежные вопросы