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

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

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

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

Tkinter

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

button

HTMLで用いる<button>タグです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

30242閲覧

【Python】【tkinter】ボタンを押すことで関数を実行し、その返り値を受け取る方法がわからない

Ryupe

総合スコア426

Python 3.x

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

Tkinter

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

button

HTMLで用いる<button>タグです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2017/12/15 07:38

質問したいことはタイトルのとおりです。

tkinterを使用してGUIアプリを作成している途中でどうしてもわからないことが出てきたので、助言をいただきたいところです。
質問するためにだいぶ端折っている部分もありますがよろしくお願いします。

###プログラムの流れ
0. アプリを起動したら「CSV」ボタンを押して、CSVデータの中身を変数(二次元配列)に格納

  1. 1で格納した2次元配列データを使用してとある処理をしたいが、引数の受け渡しがうまくいかない。

python

1from tkinter import * 2import tkinter as tk 3 4def win_build(self): 5 root.minsize(750,300) 6 root.maxsize(750,300) 7 #ウィンドウのタイトル名と表示位置、大きさ 8 root.title("SoftRobotics_Controller") 9 root.geometry() 10 11 self.frame1 = tk.Frame(self) 12 self.frame1.pack() 13 self.frame2 = tk.Frame(self) 14 self.frame2.pack() 15 16 #実行ボタン 17 btn_start = tk.Button(self.frame1, 18 text="実行", 19 font=16, 20 width=20, 21 height=5, 22 borderwidth=4, 23 command = lambda:action(data)) 24 btn_start.grid(row=0, column=0, columnspan=1, sticky=tk.W + tk.E + tk.N + tk.S) 25 26 #CSV 27 btn_csv = tk.Button(self.frame1, 28 text="CSV", 29 font=16, 30 width=20, 31 height=5, 32 borderwidth=4, 33 command = csv) 34 btn_csv.grid(row=0, column=1, columnspan=1, sticky=tk.W + tk.E + tk.N + tk.S) 35 36def csv(): 37 data = [100,200,300] 38 return data 39 40def action(data): 41 print(data) 42 43if __name__=="__main__": 44 #画面表示 45 root = Tk() 46 win_build(root) 47 root.mainloop()

###エラー文

Exception in Tkinter callback Traceback (most recent call last): File "/usr/lib/python3.5/tkinter/__init__.py", line 1562, in __call__ return self.func(*args) File "ask.py", line 23, in <lambda> command = lambda:action(data)) NameError: name 'data' is not defined

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんな感じにdataを保持するオブジェクトを作るとうまくいくと思います。

python

1class Model: 2 def load(self): 3 self.data = [100,200,300] 4 5 def start(self): 6 print(self.data) 7 8def win_build(self, command_start, command_csv): 9 ... 10 11if __name__=="__main__": 12 root = Tk() 13 model = Model() 14 win_build(root, model.start, model.load) 15 root.mainloop()

投稿2017/12/15 10:02

YouheiSakurai

総合スコア6142

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

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

Ryupe

2017/12/18 01:00

解答ありがとうございます。 ですが、この解答では私の問題解決には至りませんでした。 この解答の意味を自分なりに解釈してみましたが以下で合っていますでしょうか?? ①dataを保持するためにclassを作成 ②def win_build関数でウィンドウやボタンを構成(引数の意味は???) ③csvボタンを押すとload関数を呼び出し、CSVデータを二次元配列に格納し保存 ④実行ボタンを押すとstart関数を呼び出し、保存したデータをプリントアウト 以上の解釈があっているならば、def win_build関数内のボタンからclass Model内のload関数を呼び出す方法が分かりません。
Ryupe

2017/12/18 01:14

申し送れましたが、pythonの初心者でclassの使い方はまだ完全に理解していません。 再度教授の方をよろしくお願いします。
YouheiSakurai

2017/12/18 10:30

command_startとcommand_csvを各ボタンが押された時に実行されるようにすれば良いです。(command_startとcommand_csvをButtonインスタンス作成時のcommand引数に与えてボタンが押されたらそれが呼び出されるようにする)
Ryupe

2017/12/18 11:46

例えばCSVボタンを作る場合どのようなコーディングで上記のようなことが実現しますか? お手数おかけしますが回答の程、よろしくおねがいします。 ``` def win_build(self, command_start, command_csv): #CSV btn_csv = tk.Button(self.frame1, text="CSV", font=16, width=20, height=5, borderwidth=4, command = csv) btn_csv.grid(row=0, column=1, columnspan=1, sticky=tk.W + tk.E + tk.N + tk.S) ```
YouheiSakurai

2017/12/18 12:04

「command引数に与える」で通じませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問