質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

6349閲覧

エラーメッセージ:missing 1 required positional argument : 'event'が出てしまいます

lteru

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/03 04:30

前提・実現したいこと

Python初心者です。
PCのキープレスに応じて様々な波長の音を鳴らすアプリを作っています。
Tkinterを用いてキープレスを検出し、画面の一部に表示する機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

press_key() missing 1 required positional argument: 'event'

該当のソースコード

Python

1import tkinter as tk 2from tkinter import * 3from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 4from matplotlib.figure import Figure 5 6class Application(tk.Frame): 7 def __init__(self, master=None): 8 super().__init__(master) 9 self.master = master 10 self.master.title('Matplotlib in tkinter') 11 self.pack() 12 self.create_widgets() 13 self.press_key() 14 15 def create_widgets(self): 16#=== Canvas Frame 17 self.canvas_frame = tk.Frame(self.master) 18 self.canvas_frame.pack(side=tk.LEFT) 19#=== Presskey Frame 20 self.presskey_frame = tk.Frame(self.master) 21 self.presskey_frame.pack(side=tk.LEFT) 22#=== Canvas 23 self.canvas = FigureCanvasTkAgg(fig, self.canvas_frame) 24 self.canvas.draw() 25 self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True) 26 27#=== Press Key 28 self.labelframe = tk.LabelFrame(self.presskey_frame, text="Press key") 29 self.labelframe.pack(anchor=tk.NE) 30 31 self.label = tk.Label(self.labelframe, text="Label", anchor=tk.S) 32 self.label.pack() 33 34 self.buffer = StringVar() 35 self.buffer.set('') 36 self.press_key_label = tk.Label(self.labelframe, textvariable = self.buffer) 37 self.press_key_label.pack() 38 self.press_key_label.bind('<Any-KeyPress>', self.press_key) 39 self.press_key_label.focus_set 40 41 def press_key(self, event): 42 self.event_key = event.keysym 43 self.buffer.set('push key is %s' % self.event_key) 44 45 46 47fig = Figure(figsize=(5, 5), dpi=100) 48ax = fig.add_subplot(111) 49ax.set_xlim(-1.2,1.2) 50ax.set_ylim(-1.2,1.2) 51h, = ax.plot([],[], 'green') 52 53root = tk.Tk() 54app = Application(master=root) 55app.mainloop() 56

試したこと

キープレス検出のコードは下記を参考にしました。
http://bacspot.dip.jp/virtual_link/www/si.musashi-tech.ac.jp/new_www/Python_IntroTkinter/02/index-2.html

また、上記との違いとして、サイン波の表示等も画面上に実装したいことから、クラスを定義しています。
複数画面の実装方法は下記を参考にしました。
https://www.nakamuri.info/mw/index.php/いろいろなウィジェット

不要な部分を削除し、press_key関数の定義とFrameの定義を起こったところ、エラーが発生しました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

press_keyはイベントハンドラとして登録するためのメソッドですね。
これを__init__の中で実行する必要はないはずです。

python

1 def __init__(self, master=None): 2 super().__init__(master) 3 self.master = master 4 self.master.title('Matplotlib in tkinter') 5 self.pack() 6 self.create_widgets() 7 self.press_key()

から削除しましょう。

投稿2021/09/03 05:03

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lteru

2021/09/04 03:46

ありがとうございます。 イベントハンドラのため、イベント発生時(今回はキープレス時)に press_key関数が実行されると理解しました。 一方、__init__から削除した結果エラーはなくなりましたが、キーをプレスしても self.buffer.set(' ') → self.buffer.set('push key is %s' % self.event_key) となりませんでした。 クラス定義していない場合は入力されましたが、何が違うのでしょう??
lteru

2021/09/04 15:00

self.press_key_label.focus_setのうしろに”()”をつけ、 さらにPress Keyラベルを配置するフレームをpresskey_frameからcanvas_frameにしたところ、 イベントを検出しました。なぜpresskey_frameを指定して動かないのかわからない状態です。 self.labelframe = tk.LabelFrame(self.canvas_frame, text="Press key")
guest

0

press_key() missing 1 required positional argument: 'event'

一つの引数を取るメソッドのはずが、それがない!
とおっしゃってます

self.press_key()

これをどーにかしましょう

投稿2021/09/03 04:33

y_waiwai

総合スコア87830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lteru

2021/09/04 03:47

ありがとうございます。 イベントハンドラのため、イベント発生時(今回はキープレス時)に press_key関数が実行されると理解しました。 一方、__init__から削除した結果エラーはなくなりましたが、キーをプレスしても self.buffer.set(' ') → self.buffer.set('push key is %s' % self.event_key) となりませんでした。 クラス定義していない場合は入力されましたが、何が違うのでしょう??
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問