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

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

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

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

Q&A

解決済

1回答

353閲覧

Pythonのボタンの挙動について

gymgym

総合スコア97

Python

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

0グッド

1クリップ

投稿2017/12/11 08:09

編集2017/12/12 03:28

Python

1from tkinter import * 2from tkinter import ttk 3import pandas as pd 4import numpy as np 5 6#def button_click(): 7# show_selection() 8 9def show_selection(x): 10 for i in lb.curselection(): 11 if i == 0: 12 one = sum(x) 13 zero = len(x) - sum(x) 14 if one > zero: 15 print("OK") 16 elif i == 1: 17 one = sum(x) 18 zero = len(x) - sum(x) 19 if one > zero: 20 print("BAD") 21 22if __name__ == '__main__': 23 root = Tk() 24 root.title('Scrollbar 1') 25 26 # Frame 27 frame1 = ttk.Frame(root, padding=10) 28 frame1.grid() 29 30 # Listbox 31 currencies = ("A", "B") 32 v1 = StringVar(value=currencies) 33 lb = Listbox(frame1, listvariable=v1,height=3) 34 lb.grid(row=0, column=0) 35 36 # Scrollbar 37 scrollbar = ttk.Scrollbar( 38 frame1, 39 orient=VERTICAL, 40 command=lb.yview) 41 lb['yscrollcommand'] = scrollbar.set 42 scrollbar.grid(row=0,column=1,sticky=(N,S)) 43 44 a = [0,0,0,0,1,1,1] 45 b = [1,1,1,1,1,0,0] 46 47 #Button 48 button1 = ttk.Button(frame1, text='OK', command=lambda: show_selection(a)) 49 button1.grid(row=1, column=0, columnspan=2) 50 51 root.mainloop()

リストボックスのAが選ばれた時には、リストaに対して0の数が多ければ「OK」と表示。
リストボックスのBが選ばれた時には、リストbに対して1の数が多ければ「OK」と表示。

以上のように実行したいと考えています。

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

show_selection(x)関数は 引数 x をとりますが、呼び出し元のbutton_click関数の実装は

Python

1def button_click(): 2 show_selection()

となっており、show_selection() に引数を渡さずに呼び出しているのがうまくいかない原因です。

修正方法は、とりあえずであれば button_click関数の使用を止めて、Buttonの生成時の command 引数にて

Python

1 button1 = ttk.Button(frame1, text='OK', command=lambda: show_selection(a))

のように、lambdaを使って show_selection() を引数付きで呼び出すようにするとよいのではないでしょうか。

実現したい内容からるすと、show_selection(a, b)b も一緒に渡したほうがよいかもしれません。

あと細かいですが、 x.sum()sum(x) です。

投稿2017/12/11 10:31

magichan

総合スコア15898

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

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

gymgym

2017/12/12 03:31

回答ありがとうございます。 magichan様のご指摘通りに修正させていただきました。 内容不足だったので修正させていただいたのですが、 挙動としては、 ・リストボックスのAが選ばれた時には、リストaに対して0の数が多ければ「OK」と表示。 ・リストボックスのBが選ばれた時には、リストbに対して1の数が多ければ「OK」と表示。 このように実行したいと考えています。 お手数ですがよろしくお願いします。
magichan

2017/12/12 04:25

回等に書きましたように、lambda から呼ばれる show_selection() にて a,b 両方のデータを渡すように修正して、 show_selection()関数を条件に合わせて記述すると良いかと思います。 ("_" は SPACE に読み替えてください) def show_selection(x,y): __for i in lb.curselection(): ____if i == 0: ______# リストaに対して0の数が多ければ「OK」 ______one = sum(x) ______zero = len(x) - sum(x) ______if one < zoro: ________print("OK") ____elif i == 1: ______# リストbに対して1の数が多ければ「OK」 ______one = sum(y) ______zero = len(y) - sum(y) ______if one > zero: ________print("OK")
gymgym

2017/12/12 04:27

丁寧に回答していただきありがとうございます。 ようやく理解することができました。 自分でやってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問