2

私はこの短いスクリプトを書きました (サイズの細かい部分は省略しました)。非常に単純なエラーが表示されますが、理由がわかりません! 私はPythonに非常に慣れていないので、誰かが問題とそれが機能しない理由を説明できますか?

完全なカスタムシリアル書き込み文字列をコンソールに出力したいときにエラーが発生するようですが、関数に送信した Args を認識していないようです。

おそらく、私は非常に単純なことを誤解しています。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 で小さな GUI アプリを作成して、PySerial モジュールを使用してシリアル経由でステッピング モーターを制御しています。ただし、ケーブルの「送信」にデフォルト値を追加できるように、独自の「書き込み」機能をパッケージ化したいと考えています。たとえば、モーター番号と、命令の最後に常にリターンを追加します。同じ関数で応答をすぐに読み取るなどの他のことも、応答を測定するのに役立ちます。そのため、それをカスタム関数にラップすることは賢明なことのように思えました。

上記に関するアドバイスやヘルプをいただければ幸いです。

よろしくお願いします。

アンディ

更新:「自己」を含めないという元の問題に対処し、スタックが通常使用するタブを受け入れるようにすることができたので、見やすくなりました。また、削除した唯一のコードは単純な変数設定であることに注意してください。ただし、問題は解決しません。

4

3 に答える 3

2

self 引数がないことが原因である可能性があります。

  def send_command(self, commands):
于 2010-06-30T09:08:12.243 に答える
1

def send_command(commands) にインデント エラーがあります。

最初のパラメーターは「self」にする必要があります。

class ArialApp(object):

<snap>

    def send_command(self, commands):
        ser.write("#" + motor_no + commands + '\r\n')
于 2010-06-30T09:09:48.703 に答える
1

まず、インデントには複数のスペースを使用する必要があります。Python では空白は重要であり、空白を 1 つしか使用していない場合、それが正しいかどうかを確認するのは非常に困難です。4 は、通常受け入れられる金額です。

メソッドの主な問題send_commandは、Python のメソッドの最初の引数が (慣例により) であることを忘れていることですself。したがって、署名は次のようになります。

def send_command(self, commands):

ただし、あなたが示したコードはあなたが述べたエラーを与えません:代わりにこれを与えます:

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

さらに、あなたのメソッドでcommandsは、定義されていないのではなく、motor_no. これが、実行している実際のコードを表示し、実際にエラーを再現するのに十分なだけ切り詰めることが常に重要である理由です。

于 2010-06-30T09:10:27.767 に答える