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

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

ただいまの
回答率

91.05%

  • Python 3.x

    3712questions

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

  • 関数

    176questions

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

  • Tkinter

    85questions

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

  • button

    64questions

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

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 475

Ryupe

score 45

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

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

プログラムの流れ

  1. アプリを起動したら「CSV」ボタンを押して、CSVデータの中身を変数(二次元配列)に格納
  2. 1で格納した2次元配列データを使用してとある処理をしたいが、引数の受け渡しがうまくいかない。
from tkinter import *
import tkinter as tk

def win_build(self):
    root.minsize(750,300)
    root.maxsize(750,300)
    #ウィンドウのタイトル名と表示位置、大きさ
    root.title("SoftRobotics_Controller")
    root.geometry()

    self.frame1 = tk.Frame(self)
    self.frame1.pack()
    self.frame2 = tk.Frame(self)
    self.frame2.pack()

    #実行ボタン
    btn_start = tk.Button(self.frame1,
                          text="実行",
                          font=16,
                          width=20,
                          height=5,
                          borderwidth=4,
                          command = lambda:action(data))
    btn_start.grid(row=0, column=0, columnspan=1, sticky=tk.W + tk.E + tk.N + tk.S)

    #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)

def csv():
    data = [100,200,300]
    return data

def action(data):
    print(data)

if __name__=="__main__":
    #画面表示
    root = Tk()
    win_build(root)
    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
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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

class Model:
    def load(self):
        self.data = [100,200,300]

    def start(self):
        print(self.data)

def win_build(self, command_start, command_csv):
    ...

if __name__=="__main__":
    root = Tk()
    model = Model()
    win_build(root, model.start, model.load)
    root.mainloop()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/18 10:00

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

    以上の解釈があっているならば、def win_build関数内のボタンからclass Model内のload関数を呼び出す方法が分かりません。

    キャンセル

  • 2017/12/18 10:14

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

    キャンセル

  • 2017/12/18 19:30

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

    キャンセル

  • 2017/12/18 20: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)
    ```

    キャンセル

  • 2017/12/18 21:04

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

    キャンセル

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

  • ただいまの回答率 91.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    3712questions

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

  • 関数

    176questions

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

  • Tkinter

    85questions

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

  • button

    64questions

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