Команда не определена в Python - Реальные основы, но запутались! - PullRequest
2 голосов
/ 30 июня 2010

Я написал этот короткий сценарий (который я удалил некоторые мелкие детали для размера), и я получаю очень простую ошибку, но я не понимаю, почему! Я очень плохо знаком с Python, так что, может быть, кто-то может объяснить проблему и почему она не работает?

Ошибка, кажется, падает, когда я хочу напечатать полную консольную строку последовательной записи обратно на консоль, она, похоже, не распознает аргументы, которые я послал функции.

Возможно, я неправильно понял что-то очень простое. Должно быть простым для всех, даже с крошечным пониманием Python

Приветствия

Код:

#! /usr/bin/env python

# IMPORTS APPEAR HERE ***

ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=115200,
    parity='N',
    stopbits=1,
    bytesize=8
)

# Sets motor number
motor_no = "2"

# Lets create our main GUI class
class ArialApp(object):
    # Default init stuff
    def __init__(self):
        # Create a builder object and create the objects from the .glade file
        self.builder = gtk.Builder()
        self.builder.add_from_file("../res/main.glade")
        self.builder.connect_signals(self)

        # Open the serial connection to the encoder and keep it open
        ser.open()

        # Custom function for sending commands down the serial. Needed to wrap defaults
        # arround the custom 'serial.write' command.
        self.send_command('A')

        # Code removed for space..... 

    # Custom method for sending commands down serial with default ammendments
    def send_command(self, nanotech):
        # Send the command with the #, then motor number which should be global, then the command
        # sent the the method followed by a return
        ser.write("#" + motor_no + nanotech + '\r\n')

        # Print to the console the full command sent down the pipe
        # [[[ ERROR GOES HERE ]]]
        print "#" + motor_no + nanotech + '\r\n'

# Just to show its in here...
if __name__ == "__main__":
    app = ArialApp()
    gtk.main()

Ошибка:

File "main.py", line 62, in ArialApp
    print "#" + motor_no + commands + '\r\n'
NameError: name 'commands' is not defined

И, наконец, просто рассмотрим ситуацию:

Я пишу небольшое приложение с графическим интерфейсом на Glade и Python / PyGTK для управления шаговым двигателем через последовательный порт с помощью модуля PySerial. Тем не менее, я хотел бы упаковать свою собственную функцию «записи», чтобы я мог добавить значения по умолчанию к «отправить» по кабелю. Например, номер двигателя и всегда добавление возвращаются в конце инструкции. Другие вещи, такие как немедленное считывание ответа в одной и той же функции, также могут быть полезны для оценки ответов, поэтому включение их в пользовательскую функцию представляется разумным.

Буду признателен за любой совет или помощь по вышеуказанному.

Спасибо, любезно.

Andy

ОБНОВЛЕНИЕ: У меня есть проблема с оригинальным включением «я», и мне удалось заставить Стек принимать вкладки, которые я обычно использую, чтобы его было удобнее смотреть. Также хотел отметить, что единственный код, который я удалил, был простой установкой переменной. Однако проблема не устранена!

Ответы [ 3 ]

2 голосов
/ 30 июня 2010

Возможно, вам не хватает аргумента self:

  def send_command(self, commands):
1 голос
/ 30 июня 2010

Во-первых, вы должны использовать более одного пробела для отступа. Пробел имеет большое значение в Python, и очень трудно понять, что вы правильно поняли, если используете только один пробел. Четвертая сумма обычно принимается.

Основная проблема с вашим send_command методом заключается в том, что вы забыли, что первым аргументом любого метода в Python является (по соглашению) self. Так что подпись должна быть:

def send_command(self, commands):

Тем не менее, код, который вы показали, не дал бы ошибку, которую вы заявляете: он вместо этого дал бы это:

TypeError: send_command() takes exactly 1 argument (2 given)

Кроме того, в вашем методе это не commands, который не определен, а motor_no. Вот почему всегда важно показывать фактический код, который вы выполняете, достаточно урезанный, чтобы фактически воспроизвести ошибку.

1 голос
/ 30 июня 2010

вы получили ошибку отступа в def send_command (команды):

и ваш первый параметр должен быть "self":

class ArialApp(object):

<snap>

    def send_command(self, commands):
        ser.write("#" + motor_no + commands + '\r\n')
...