1

質問

同じクラス内で、メソッド内から関数にアクセスするにはどうすればよいでしょうか?

バックグラウンド

「こんにちは世界」私は現在、Tkinter を使用して GUI IM プログラムに取り組んでいます。ソケット経由でメッセージを送信するには、メソッドから関数にアクセスする必要があります。私のself.networkメソッドには、send_message()アクセスしたいという関数があります。

コード

それにアクセスするために、私はこのコードを使用しようとしました:

def messageFun(self):

    //Other widgets are here//

    self.send = Button (self.messageFrame, text = "Send",
                        command = self.network(send_message()))
    self.send.grid(row = 1, column = 1, sticky = S)

self.networkメソッドと関数は次のsend_messageとおりです。

def network(self):

    def send_message():   
            #Send some data to the remote server
            message = self.message.get("0.0",END)

            try:
                 #set the whole string
                 s.sendall(message)
            except socket.error:
            #Send Failed
                print "Send failed"
                sys.exit()

コードをデバッグするための努力にもかかわらず、常に次のメッセージが表示されます。

Traceback (most recent call last):
  File "D:\Python Programs\Sockets\First Project\IM Project\Server GUI InDev.py", line 178, in <module>
    app = Application(root)
  File "D:\Python Programs\Sockets\First Project\IM Project\Server GUI InDev.py", line 73, in __init__
    self.messageFun()
  File "D:\Python Programs\Sockets\First Project\IM Project\Server GUI InDev.py", line 156, in messageFun
    command = self.network(send_message()))
NameError: global name 'send_message' is not defined
4

2 に答える 2

2

network(send_message())関数をトリガーしようとする奇妙な構文ですsend_message()

私はこの方法のいずれかを提案します:

def send_message(instance):   
        #Send some data to the remote server
        message = instance.message.get("0.0",END)

        try:
             #set the whole string
             s.sendall(message)
        except socket.error:
        #Send Failed
            print "Send failed"
            sys.exit()

def network(self,what,send_message=send_message):
    if what =='send message":
        send_message(self)


self.send = Button (self.messageFrame, text = "Send",
                    command = self.network("send message"))

このいずれか:

class NENE:
    def __init__(self):
        self.network.__dict__['send'] = send_message

    def send_message(self):   
        #Send some data to the remote server
        message = self.message.get("0.0",END)
        try:
             #set the whole string
             s.sendall(message)
        except socket.error:
        #Send Failed
            print "Send failed"
            sys.exit()

    def network(self):
        pass


self.send = Button (self.messageFrame, text = "Send",
                    command = self.network.send_message())

この 2 番目のコードでは、実際の関数の内容がわからないためpass、関数を入れましたが、この内容をこれの代わりに入れますnetwork()pass

どのように動作するかを示すために、メソッドをクラスに入れましたNENE。メソッドであるインスタンスと同じインスタンスのメソッドsend_message()で ある必要があるためです。 次に、新しいインスタンスが作成されるたびに、メソッドの属性にもなります。 したがって、全体としてインスタンスとそのメソッドの 1 つの属性です。しかし、それがあなたの目的を達成することを除いて、それは問題ではありません。現在、属性を介して呼び出すことができる属性であり、それが機能するインスタンスが何であるかを知っています。network()
send_message()network()
send_message()send_message()network()network

下手な英語ですみません

于 2013-02-28T15:30:17.607 に答える
0

send_messageの外部でアクセスする必要がある場合はnetwork、外部で定義する必要がありnetworkます。

def send_message(self):   
    #Send some data to the remote server
    message = self.message.get("0.0",END)

    try:
        #set the whole string
        s.sendall(message)
    except socket.error:
    #Send Failed
        print "Send failed"
        sys.exit()
def network(self):
    #do network stuff...

def messageFun(self):

    //Other widgets are here//

    self.send = Button (self.messageFrame, text = "Send",
                        command = self.send_message)
    self.send.grid(row = 1, column = 1, sticky = S)

send_messageにローカルな変数へのアクセスが必要networkで、network現在何も返さない場合は、内部で定義しsend_messagenetwork最後に返すことができます。

def network(self):
    #create the socket needed for send_message
    s = Socket()

    def send_message():   
        #Send some data to the remote server
        message = self.message.get("0.0",END)

        try:
            #set the whole string
            s.sendall(message)
        except socket.error:
        #Send Failed
            print "Send failed"
            sys.exit()

    #do other network stuff...
    return send_message

def messageFun(self):

    //Other widgets are here//

    self.send = Button (self.messageFrame, text = "Send",
                        command = self.network()
    self.send.grid(row = 1, column = 1, sticky = S)

ネットワークにすでに戻り値がある場合は、ネットワークのローカル変数をクラス スコープに配置して、send_messageそれらを表示できます。

def send_message(self):   
    #Send some data to the remote server
    message = self.message.get("0.0",END)

    try:
        #set the whole string
        self.s.sendall(message)
    except socket.error:
    #Send Failed
        print "Send failed"
        sys.exit()

def network(self):
    #create the socket needed for send_message
    self.s = Socket()
    #do other network stuff

def messageFun(self):

    //Other widgets are here//

    self.send = Button (self.messageFrame, text = "Send",
                        command = self.send_message
    self.send.grid(row = 1, column = 1, sticky = S)
于 2013-02-28T15:20:01.023 に答える