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

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

詳細はこちら
Python 3.x

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

Tkinter

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

Q&A

解決済

2回答

1762閲覧

[Python3] tkinter, 緊急停止ボタンの作成に関して教えてください

3265462164

総合スコア67

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2019/11/01 07:57

編集2019/11/04 23:43

■やりたいこと
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

回答2

0

イベント処理が終わらないと描画処理が動けないため、処理が終わったあとにウィンドウが表示されます。
時間のかかる処理を別スレッドにして、イベント処理をさっさと終わらせるといいです。

py

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

投稿2019/11/27 05:44

編集2019/12/03 07:07
shiracamus

総合スコア5406

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

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

3265462164

2019/12/03 07:05

shiracamusさん、どうもありがとうございました!仕様的にベストアンサーがつけられない状態です。もうしわけございません。回答、参考にさせていただきます。ありがとうございました。
guest

0

自己解決

解決方法(自己解決の場合のみ記入してください)

投稿2020/03/06 00:13

3265462164

総合スコア67

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問