###前提・実現したいこと
参考書を読みながら、Echoアプリケーションを作成中です。
言語はPythonで、Tkinter,syncore,functoolsライブラリを使っています。
今回のコードはクライアント側なのですが、実行しようとしてもエラーが出てしまい、GUIの画面もうまく表示されません。
こういう場で質問することが初めてなので、至らないところがあるかもしれないので、その時はご指摘ください。
###発生している問題・エラーメッセージ
Traceback (most recent call last): File "/Users/CHIHIRO/Downloads/Python/Part3/11/client.py", line 76, in <module> main() File "/Users/CHIHIRO/Downloads/Python/Part3/11/client.py", line 68, in main root.after(200, functools.partial(idle_task, root)) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/tkinter/__init__.py", line 593, in after callit.__name__ = func.__name__ AttributeError: 'functools.partial' object has no attribute '__name__'
###該当のソースコード
Python3
1# -*- coding::utf-8 -*- 2 3import tkinter 4import asyncore 5import functools 6 7class EchoView(tkinter.Frame): 8 """ Echo User Interface """ 9 10 def __init__(self, master): 11 super(EchoView, self).__init__(master) 12 self.listcontainer = tkinter.Frame(self) 13 self.listbox = tkinter.Listbox(self.listcontainer) 14 self.yscroll = tkinter.Scrollbar(self.listcontainer) 15 self.listbox.pack(side=tkinter.LEFT, expand=True, fill=tkinter.BOTH) 16 self.yscroll.pack(side=tkinter.LEFT, expand=True, fill=tkinter.Y) 17 self.listcontainer.pack(expand=True, fill=tkinter.BOTH) 18 19 self.entry = tkinter.Entry(self) 20 self.entry.pack(side=tkinter.BOTTOM, expand=True, fill=tkinter.X) 21 22 def get_submit_messegae(self): 23 data = self.entry.get() 24 self.entry.delete(0, tkinter.END) 25 return data 26 27 def show_message(self, message): 28 self.listbox.insert(tkinter.END, message) 29 self.listbox.see(tkinter.END) 30 31class EchoClient(asyncore.dispatcher_with_send): 32 def __init__(self, view): 33 super(EchoClient, self).__init__() 34 self.create_socket() 35 self.buffers = [] 36 self.view = view 37 self.bind_all() 38 39 def bind_all(self): 40 self.view.entry.bind('<Return>', self.on_submit) 41 42 def on_submit(self, event): 43 message = self.view.get_submit_messegae() 44 self.buffers.append(message.encode('utf-8')) 45 46 def handle_write(self): 47 if not self.buffers: 48 return 49 buffer, self.buffers = self.buffers[0],self.buffers[1:] 50 self.send(buffer) 51 52 def writable(self): 53 return self.buffers 54 55 56 def handle_read(self): 57 message = self.recv(8192) 58 self.view.show_message(message.decode('utf-8')) 59 60def idle_task(root): 61 try: 62 asyncore.loop(count=1, timeout=1) 63 finally: 64 root.after(200, functools.partial(idle_task, root)) 65 66def main(): 67 root = tkinter.Tk() 68 root.after(200, functools.partial(idle_task, root)) 69 view = EchoView(root) 70 view.pack(expand=True, fill=tkinter.BOTH) 71 client = EchoClient(view) 72 client.connect(('localhost', 8080)) 73 root.mainloop() 74 75if __name__ == '__main__': 76 main() 77 78 79
###試したこと
エラーメッセージにmain関数のfunctools.partailの部分が出ているので、functorsのドキュメントを読んだのですが、自分では原因がわかりませんでした。
ですので、助けて頂けるとありがたいです。
よろしくお願いします。
###補足情報(言語/FW/ツール等のバージョンなど)
Python3.4.4
『パーフェクトPython』:
著 Pythonサポーターズ:
発行 技術評論社:
11章チャットアプリケーションのP230~P235の部分です
回答1件
あなたの回答
tips
プレビュー