🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Tkinter

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

Q&A

解決済

1回答

1239閲覧

[Python3] tkinter, チェックボタンで取得したvalue値を参照し関数を実行したい

3265462164

総合スコア67

Python 3.x

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

Tkinter

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

0グッド

1クリップ

投稿2019/09/24 08:19

Python3で、tkinterを使用して、下記のコードを作成しました。

python

1from tkinter import * 2from tkinter import ttk 3 4root = Tk() 5root.title('測定CH設定') 6root.geometry("500x350+640+40") 7 8frame1 = ttk.Labelframe(root, text='測定帯域選択', padding=5) 9frame1.grid(row=0, column=0, columnspan=1, padx=15, pady=10, sticky='w') 10frame2 = ttk.Labelframe(root, text='2.4GHz',padding=5) 11frame2.grid(row=1,column=0, columnspan=1, padx=15, pady=10, sticky='nw') 12frame3 = ttk.Labelframe(root, text='5GHz',padding=5) 13frame3.grid(row=1,column=1, columnspan=1, padx=10, pady=10, sticky='w') 14 15selected_frame = IntVar() 16 17def change_selected_frame(): 18 if selected_frame.get() == 0: 19 for child in frame2.winfo_children(): 20 child.configure(state='enable') 21 for child in frame3.winfo_children(): 22 child.configure(state='disable') 23 24 elif selected_frame.get() == 1: 25 for child in frame2.winfo_children(): 26 child.configure(state='disable') 27 for child in frame3.winfo_children(): 28 child.configure(state='enable') 29 30 else: 31 for child in frame2.winfo_children(): 32 child.configure(state='disable') 33 for child in frame3.winfo_children(): 34 child.configure(state='disable') 35 36rb1 = ttk.Radiobutton(frame1, text='2.4GHz ', variable=selected_frame, value=0, command=change_selected_frame) 37rb1.grid(row=1,column=0,pady=5) 38rb2 = ttk.Radiobutton(frame1,text='5GHz', variable=selected_frame, value=1, command=change_selected_frame) 39rb2.grid(row=1,column=1,pady=5) 40 41class val_2G: 42 def __init__(self,name,set_frame,row_no): 43 self.bool=BooleanVar() 44 self.bool.set(False) 45 self.name=name 46 self.Cbtn=ttk.Checkbutton(set_frame, text=self.name, variable=self.bool) 47 self.Cbtn.grid(row=row_no,column=0, columnspan=1, padx=15, pady=5, sticky='w') 48 49class val_5G: 50 def __init__(self,name,set_frame,row_no): 51 self.bool=BooleanVar() 52 self.bool.set(False) 53 self.name=name 54 self.Cbtn=ttk.Checkbutton(set_frame, text=self.name, variable=self.bool) 55 self.Cbtn.grid(row=row_no,column=0, columnspan=1, padx=15, pady=5, sticky='w') 56 57val_2G1=val_2G('CH1',frame2,6) 58val_2G2=val_2G('CH2',frame2,7) 59val_2G3=val_2G('CH3',frame2,8) 60val_2G_list=[val_2G1, val_2G2, val_2G3] 61 62val_5G36=val_5G('CH36',frame3,6) 63val_5G40=val_5G('CH40',frame3,7) 64val_5G44=val_5G('CH44',frame3,8) 65val_5G_list=[val_5G36, val_5G40, val_5G44] 66 67def check_all_2G_checkboxes(): 68 for val in val_2G_list: 69 val.bool.set(True) 70 71def clear_all_2G_checkboxes(): 72 for val in val_2G_list: 73 val.bool.set(False) 74 75def check_all_5G_checkboxes(): 76 for val in val_5G_list: 77 val.bool.set(True) 78 79def clear_all_5G_checkboxes(): 80 for val in val_5G_list: 81 val.bool.set(False) 82 83def check_box(): 84 selected_channel='' 85 86 for val in val_2G_list: 87 if val.bool.get(): 88 if selected_channel=='': 89 selected_channel+=val.name 90 else: 91 selected_channel+=' & '+val.name 92 93 for val in val_5G_list: 94 if val.bool.get(): 95 if selected_channel=='': 96 selected_channel+=val.name 97 else: 98 selected_channel+=' & '+val.name 99 100 print(selected_channel) 101 102def quit(): 103 root.destroy() 104 105btn1 = ttk.Button(frame2, text='全選択', padding=5, command=check_all_2G_checkboxes) 106btn1.grid(row=5,column=0,pady=5) 107 108btn2 = ttk.Button(frame2, text='全解除', padding=5, command=clear_all_2G_checkboxes) 109btn2.grid(row=5,column=1,pady=5) 110 111btn3 = ttk.Button(frame3, text='全選択', padding=5, command=check_all_5G_checkboxes) 112btn3.grid(row=5,column=0,pady=5) 113 114btn4 = ttk.Button(frame3, text='全解除', padding=5, command=clear_all_5G_checkboxes) 115btn4.grid(row=5,column=1,pady=5) 116 117btn5 = ttk.Button(text='測定', padding=5, command=check_box) 118btn5.grid(row=5,column=0,pady=5) 119 120btn6 = ttk.Button(text='中止', padding=5, command=quit) 121btn6.grid(row=5,column=1,pady=5) 122 123selected_frame.set(-1) 124change_selected_frame() 125 126root.mainloop()

選択されたラジオボタン、チェックボタンの情報をもとに次のコードを設定したいのですが、
どのように関数を組み込めばいいのか解りません。

python

1from selenium import webdriver 2driver = webdriver.Firefox() 3driver.get('http://router.asus.com') 4 5driver.find_element_by_id('login_username').send_keys('admin') 6driver.find_element_by_name('login_passwd').send_keys('password') 7driver.find_element_by_class_name('button').click() 8 9driver.maximize_window() 10driver.get('http://router.asus.com/Advanced_Wireless_Content.asp') 11 12from selenium.webdriver.support.ui import Select 13 14f2g = driver.find_elements_by_name('wl_unit') 15Select(f2g[2]).select_by_value("0") # ← 周波数帯域選択、0か1の値 16 17f2g = driver.find_element_by_name('wl_channel') 18f2g_ch = Select(f2g) 19f2g_ch.select_by_value("3") # ← チャンネル指定(周波数帯域選択が1の場合[1,2,3] 選択が1の場合[36,40,44]) 20 21driver.find_element_by_id('applyButton').click() 22 23from selenium.webdriver.common.alert import Alert 24Alert(driver).accept() 25 26コード

初心者のため解り辛いコードで大変申しわけございません。

もしご存知の方がいたらご教授いただけないでしょうか。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

1.
まずは測定するチャンネルの扱いですが、現状の実装では "&" で結合した文字列としておりますが、リストに格納するほうが良いかと思います。

あとは、このリストを引数とした測定用の関数(ここでは仮にmeasure_channels()としております)を呼ぶだけです。

Python

1def check_box(): 2 # チャンネルを格納するためのリストを準備 3 selected_channels = [] 4 # 2.4GHz選択中 5 if selected_frame.get() == 0: 6 for val in val_2G_list: 7 # チェックボックスがチェックされているものをリストに格納 8 if val.bool.get(): 9 selected_channels.append(val.name) 10 # 5GHz選択中 11 elif selected_frame.get() == 1: 12 for val in val_5G_list: 13 # チェックボックスがチェックされているものをリストに格納 14 if val.bool.get(): 15 selected_channels.append(val.name) 16 # リストが空でなかったら測定をおこなう関数を呼ぶ 17 if len(selected_channels) > 0: 18 measure_channels(selected_channels)

2.
測定用の関数(measure_channels())は基本的に質問の2つ目のコードをそのまま実装して行くことになるかと思いますが、各チャンネル毎の処理は必要な場合はループを使って実装します
下にダミー(何もしない)の実装例を記述しましたので参考にしてください。

現在の実装にて、チェックボックスの名前は "CH1", "CH36" のようになっておりますが、下側の測定用のコードでは数値部 "1", "36" のみ使用するようでしたので、startswith() にて "CH" から始まっていることをチェックした上で、先頭2文字を削除するようになってます

Python

1# 測定を行う(引数 channels は測定するチャンネルのリスト) 2def measure_channels(channels): 3 # ここに測定用のコードを実装する 4 5 # 各チャンネル毎に処理 6 for channel in channels: 7 # "CH" から始まっていないチャンネル名の場合はスキップ 8 if not channel.startswith('CH'): 9 continue 10 # 先頭2文字("CH")を削除 11 ch = channel[2:] 12 print(f'チャンネル {ch} を測定中') 13 # ここに各チャンネル毎の処理を記述する 14 # (現状は何もしないで1秒待つだけの実装です) 15 time.sleep(1) 16 17 print("測定終了")

3.
tkinter に置いて各イベント関数(ボタンを押した際などに呼ばれる関数など)にて時間を要する処理をおこなってしまうと、他のイベント処理を行うことができなくなり Windowが固まった状態になってしまいます。
もし測定用の関数が時間を要する可能性が場合は、その処理を別Threadにて行う方が良いかと思います。

やり方としては簡単で、2で作成した関数を threading.Thread() で指定して、start()にて実行するだけです

Python

1import threading # ←追加 2# (略) 3def check_box(): 4 # (略) 5 # リストが空でなかったら測定をおこなう関数を呼ぶ 6 if len(selected_channels) > 0: 7 # measure_channels(selected_channels) この部分を下記のように変更 8 # measure_channels() 関数を別スレッドにて実行 9 thread = threading.Thread(target=measure_channels, args=(selected_channels,)) 10 thread.start()

あと補足ですが、測定関数を別Threadした場合、測定関数を実行中に再度「測定」ボタンが押され、測定関数が多重に動作する可能性がありますので、測定中は 「測定」ボタンを無効化するなどの対策を施してください。

投稿2019/09/25 00:42

magichan

総合スコア15898

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

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

3265462164

2019/09/25 02:24

magichanさん、どうも有難うございました! リストやループ処理はサイトでしらべたのですが、このケースの場合 どのように落とし込むのかが全く解りませんでした。 教えていただいたコードを参考にして、ほぼ私が想定していた通りの動作となっております。 後は色々さわってみようと思います。 本当に助かりました。 有難うございました!
3265462164

2019/09/27 01:55

こんにちは。教えていただいたコードに対して少し質問があったので、 その部分だけ抜き出し新たに質問させていただきました。 もしご存知でしたらお手すきの際にご回答お願いいたします。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問