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

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

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

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

Tkinter

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

Q&A

解決済

1回答

2313閲覧

[Python3] tkinter, 緊急停止ボタンの作成

3265462164

総合スコア67

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2019/11/06 02:21

■やりたいこと
1、 ラジオボタンにて帯域を選択したあと、チェックボックスを選択し、
【測定開始】ボタンを押した際に、常に前面に表示されるウィンドウを作りたい。

2、 サブウィンドウの中に「停止」ボタンを作りたい(ボタン作成のコードは作成したが反映しない)

■現状
【測定開始】ボタンを押した際に、一番最初に表示させたいサブウィンドウが、一番最後に表示されてしまう。
サブウィンドウの中に一つボタンを作りたいのだが、コードが反映していない。

python

1 2from tkinter import * 3from tkinter import ttk 4from time import sleep 5 6root = Tk() 7root.title('測定CH設定') 8root.geometry("500x860+710+40") 9 10Lframe1 = ttk.Labelframe(root, text='測定帯域選択', padding=5) 11Lframe1.grid(row=0, column=0, columnspan=1, padx=15, pady=10, sticky='w') 12Lframe2 = ttk.Labelframe(root, text='2.4GHz',padding=5) 13Lframe2.grid(row=1,column=0, columnspan=1, padx=15, pady=10, sticky='nw') 14Lframe3 = ttk.Labelframe(root, text='5GHz',padding=5) 15Lframe3.grid(row=1,column=1, columnspan=1, padx=10, pady=10, sticky='w') 16 17selected_frame = IntVar() 18 19def change_selected_frame(): 20 if selected_frame.get() == 0: 21 22 for child in Lframe2.winfo_children(): 23 child.configure(state='enable') 24 for child in Lframe3.winfo_children(): 25 child.configure(state='disable') 26 27 elif selected_frame.get() == 1: 28 for child in Lframe2.winfo_children(): 29 child.configure(state='disable') 30 for child in Lframe3.winfo_children(): 31 child.configure(state='enable') 32 33 else: 34 for child in Lframe2.winfo_children(): 35 child.configure(state='disable') 36 for child in Lframe3.winfo_children(): 37 child.configure(state='disable') 38 39Rbutton1 = ttk.Radiobutton(Lframe1, text='2.4GHz ', variable=selected_frame, value=0, command=change_selected_frame) 40Rbutton1.grid(row=1,column=0,pady=5) 41Rbutton2 = ttk.Radiobutton(Lframe1,text='5GHz', variable=selected_frame, value=1, command=change_selected_frame) 42Rbutton2.grid(row=1,column=1,pady=5) 43 44class val_2G: 45 def __init__(self,name,set_frame,row_no): 46 self.bool=BooleanVar() 47 self.bool.set(False) 48 self.name=name 49 self.Cbtn=ttk.Checkbutton(set_frame, text=self.name, variable=self.bool) 50 self.Cbtn.grid(row=row_no,column=0, columnspan=1, padx=15, pady=5, sticky='w') 51 52class val_5G: 53 def __init__(self,name,set_frame,row_no): 54 self.bool=BooleanVar() 55 self.bool.set(False) 56 self.name=name 57 self.Cbtn=ttk.Checkbutton(set_frame, text=self.name, variable=self.bool) 58 self.Cbtn.grid(row=row_no,column=0, columnspan=1, padx=15, pady=5, sticky='w') 59 60val_2G1=val_2G('CH1',Lframe2,6) 61val_2G2=val_2G('CH2',Lframe2,7) 62val_2G3=val_2G('CH3',Lframe2,8) 63val_2G4=val_2G('CH4',Lframe2,9) 64val_2G5=val_2G('CH5',Lframe2,10) 65val_2G6=val_2G('CH6',Lframe2,11) 66val_2G7=val_2G('CH7',Lframe2,12) 67val_2G8=val_2G('CH8',Lframe2,13) 68val_2G9=val_2G('CH9',Lframe2,14) 69val_2G10=val_2G('CH10',Lframe2,15) 70val_2G11=val_2G('CH11',Lframe2,16) 71val_2G12=val_2G('CH12',Lframe2,17) 72val_2G13=val_2G('CH13',Lframe2,18) 73val_2G_list=[val_2G1, val_2G2, val_2G3, val_2G4, val_2G5, val_2G6, val_2G7, val_2G8, val_2G9, val_2G10, val_2G11, val_2G12, val_2G13] 74 75val_5G36=val_5G('CH36',Lframe3,6) 76val_5G40=val_5G('CH40',Lframe3,7) 77val_5G44=val_5G('CH44',Lframe3,8) 78val_5G48=val_5G('CH48',Lframe3,9) 79val_5G52=val_5G('CH52',Lframe3,10) 80val_5G56=val_5G('CH56',Lframe3,11) 81val_5G60=val_5G('CH60',Lframe3,12) 82val_5G64=val_5G('CH64',Lframe3,13) 83val_5G100=val_5G('CH100',Lframe3,14) 84val_5G104=val_5G('CH104',Lframe3,15) 85val_5G108=val_5G('CH108',Lframe3,16) 86val_5G112=val_5G('CH112',Lframe3,17) 87val_5G116=val_5G('CH116',Lframe3,18) 88val_5G120=val_5G('CH120',Lframe3,19) 89val_5G124=val_5G('CH124',Lframe3,20) 90val_5G128=val_5G('CH128',Lframe3,21) 91val_5G132=val_5G('CH132',Lframe3,22) 92val_5G136=val_5G('CH136',Lframe3,23) 93val_5G140=val_5G('CH140',Lframe3,24) 94val_5G_list=[val_5G36, val_5G40, val_5G44, val_5G48, val_5G52, val_5G56,val_5G60, val_5G64, val_5G100, val_5G104, val_5G108, val_5G112, val_5G116, val_5G120, val_5G124, val_5G128, val_5G132, val_5G136, val_5G140] 95 96 97def check_all_2G_checkboxes(): 98 for val in val_2G_list: 99 val.bool.set(True) 100 101def clear_all_2G_checkboxes(): 102 for val in val_2G_list: 103 val.bool.set(False) 104 105def check_all_5G_checkboxes(): 106 for val in val_5G_list: 107 val.bool.set(True) 108 109def clear_all_5G_checkboxes(): 110 for val in val_5G_list: 111 val.bool.set(False) 112 113def sub_window(): 114 sub_window = Toplevel() 115 sub_window.title('緊急停止') 116 sub_window.attributes("-topmost", True) 117 sub_window.geometry("600x300+660+400") 118 btn = ttk.Button(text='停止', padding=5) ##ボタンが作成されない 119 120def check_box(): 121 global checkbox 122 123 sub_window() ##一番最初に表示し緊急停止ボタンのように動かしたいのだが、一番最後に表示されてしまう 124 125 selected_channels2 = [] 126 selected_channels5 = [] 127 128 if selected_frame.get() == 0: 129 for val in val_2G_list: 130 if val.bool.get(): 131 selected_channels2.append(val.name) 132 133 elif selected_frame.get() == 1: 134 for val in val_5G_list: 135 if val.bool.get(): 136 selected_channels5.append(val.name) 137 138 if len(selected_channels2) > 0: 139 measure_channels2(selected_channels2) 140 141 elif len(selected_channels5) > 0: 142 measure_channels5(selected_channels5) 143 144def measure_channels2(channels2): 145 for channel2 in channels2: 146 ch2 = channel2[2:] 147 print(f'チャンネル {ch2} を測定中') 148 sleep(5) 149 print("測定終了") 150 151def measure_channels5(channels5): 152 for channel5 in channels5: 153 ch5 = channel5[2:] 154 print(f'チャンネル {ch5} を測定中') 155 sleep(5) 156 print("測定終了") 157 158def quit(): 159 global checkbox 160 checkbox.destroy() 161 162btn1 = ttk.Button(Lframe2, text='全選択', padding=5, command=check_all_2G_checkboxes) 163btn1.grid(row=5,column=0,pady=5) 164btn2 = ttk.Button(Lframe2, text='全解除', padding=5, command=clear_all_2G_checkboxes) 165btn2.grid(row=5,column=1,pady=5) 166btn3 = ttk.Button(Lframe3, text='全選択', padding=5, command=check_all_5G_checkboxes) 167btn3.grid(row=5,column=0,pady=5) 168btn4 = ttk.Button(Lframe3, text='全解除', padding=5, command=clear_all_5G_checkboxes) 169btn4.grid(row=5,column=1,pady=5) 170btn5 = ttk.Button(text='測定開始', padding=5, command=check_box) 171btn5.grid(row=5,column=0,pady=5) 172btn6 = ttk.Button(text='キャンセル', padding=5, command=quit) 173btn6.grid(row=5,column=1,pady=5) 174selected_frame.set(-1) 175change_selected_frame() 176 177root.mainloop() 178 179

記述方法ご存知の方いらっしゃいましたら、ご教授頂けると幸いです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

サブウィンドウの中に一つボタンを作りたいのだが、コードが反映していない。

ボタンを作成しただけで、配置していないからです。適当なレイアウトマネージャ(pack()/grid()/place())を使って配置してください。

Python

1 # どのWindowに配置するのかを明記する 2 btn = ttk.Button(sub_window, text='停止', padding=5) 3 # 配置する 4 btn.pack()

【測定開始】ボタンを押した際に、一番最初に表示させたいサブウィンドウが、一番最後に表示されてしまう。

今回のように時間がかかる処理を mainloopからのコールバック(check_box())内で実行してしまうと、処理が終了する(Returnが返る)までmainloop内の処理を行うことが出来なくなりますので、それまで新規のWindowは作成されません。またmainloopの処理が滞ることでWindowが固まるなどの不具合を引き起こしますので、コールバック関数内で時間のかかる処理を行うことはお勧めできません。

ですので、処理に時間がかかる処理(measure_channels2(),measure_channels5())を別スレッドにて実行するなどの対策を講じることで今回の不具合は解決するかと思います。

投稿2019/11/06 03:29

magichan

総合スコア15898

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

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

3265462164

2019/11/06 03:53

ご回答ありがとうございました。 ボタンの配置に関しては、3つのレイアウトマネージャー全て試したのですが 何も表示されなかったのでコードは記載しませんでした。 解り辛くて申し訳ございません。 エラーコードも出ないので、何が原因なのか解らず困っております。 コールバック内での関数処理に関してありがとうございました。 別スレッドにて動かせるように修正してみます。
magichan

2019/11/06 04:12

Button() の第一引数に sub_window(buttonを配置する windowのインスタンス)を渡していないのではないでしょうか。 回答にあるコードを参考にしてみてください
3265462164

2019/11/07 05:27

ありがとうございました!! やっと意味が理解できました。 第一引数に、sub_window,を追記したところ サブウインドウの中にボタンが作成されました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問