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

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

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

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

Tkinter

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

Q&A

解決済

1回答

1942閲覧

[Python3] tkinter, 特定のウィンドウを常に前面に表示させたい

3265462164

総合スコア67

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2019/10/31 00:12

■やりたいこと
1、「測定開始」のボタンを押し、関数「check_box」を実行した際に、新規ウィンドウが常に前面に表示されるようにしたい
. ⇒ 現状"topmost" 属性というものを使用しているが、処理の一番最後にウィンドウが立ち上がっている様に見える

2、新しく作成する新規ウィンドウ「停止」の中に、新しいボタンを作成したい

記述方法ご存知の方いらっしゃいましたら、ご教授していただけないでしょうか。

python

1 2from tkinter import * 3from tkinter import ttk 4 5root = Tk() 6root.title('測定CH設定') 7root.geometry("500x860+710+40") 8 9Lframe1 = ttk.Labelframe(root, text='地域選択', padding=5) 10Lframe1.grid(row=0, column=0, columnspan=1, padx=15, pady=10, sticky='w') 11 12Lframe2 = ttk.Labelframe(root, text='関東',padding=5) 13Lframe2.grid(row=1,column=0, columnspan=1, padx=15, pady=10, sticky='nw') 14 15Lframe3 = ttk.Labelframe(root, text='関西',padding=5) 16Lframe3.grid(row=1,column=1, columnspan=1, padx=10, pady=10, sticky='w') 17 18selected_frame = IntVar() 19 20 21def change_selected_frame(): 22 if selected_frame.get() == 0: 23 24 for child in Lframe2.winfo_children(): 25 child.configure(state='enable') 26 for child in Lframe3.winfo_children(): 27 child.configure(state='disable') 28 29 elif selected_frame.get() == 1: 30 for child in Lframe2.winfo_children(): 31 child.configure(state='disable') 32 for child in Lframe3.winfo_children(): 33 child.configure(state='enable') 34 35 else: 36 for child in Lframe2.winfo_children(): 37 child.configure(state='disable') 38 for child in Lframe3.winfo_children(): 39 child.configure(state='disable') 40 41 42Rbutton1 = ttk.Radiobutton(Lframe1, text='関東', variable=selected_frame, value=0, command=change_selected_frame) 43Rbutton1.grid(row=1,column=0,pady=5) 44 45Rbutton2 = ttk.Radiobutton(Lframe1,text='関西', variable=selected_frame, value=1, command=change_selected_frame) 46Rbutton2.grid(row=1,column=1,pady=5, padx=5) 47 48 49class val_kanto: 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 57class val_kansai: 58 def __init__(self,name,set_frame,row_no): 59 self.bool=BooleanVar() 60 self.bool.set(False) 61 self.name=name 62 self.Cbtn=ttk.Checkbutton(set_frame, text=self.name, variable=self.bool) 63 self.Cbtn.grid(row=row_no,column=0, columnspan=1, padx=15, pady=5, sticky='w') 64 65 66val_kanto1=val_kanto('東京',Lframe2,6) 67val_kanto2=val_kanto('神奈川',Lframe2,7) 68val_kanto_list=[val_kanto1, val_kanto2] 69 70val_kansai1=val_kansai('大阪',Lframe3,6) 71val_kansai2=val_kansai('兵庫',Lframe3,7) 72val_kansai_list=[val_kansai1, val_kansai2] 73 74 75def check_all_kanto_checkboxes(): 76 for val in val_kanto_list: 77 val.bool.set(True) 78 79def clear_all_kanto_checkboxes(): 80 for val in val_kanto_list: 81 val.bool.set(False) 82 83 84 85def check_all_kansai_checkboxes(): 86 for val in val_kansai_list: 87 val.bool.set(True) 88 89def clear_all_kansai_checkboxes(): 90 for val in val_kansai_list: 91 val.bool.set(False) 92 93 94 95def check_box(): 96 import tkinter as tk 97 root = tk.Tk() 98 root.title('停止') 99 root.attributes("-topmost", True) 100 root.geometry("600x300+660+400") 101 102 103 selected_kanto = [] 104 selected_kansai = [] 105 106 if selected_frame.get() == 0: 107 for val in val_kanto_list: 108 if val.bool.get(): 109 selected_kanto.append(val.name) 110 111 elif selected_frame.get() == 1: 112 for val in val_kansai_list: 113 if val.bool.get(): 114 selected_kansai.append(val.name) 115 116 if len(selected_kanto) > 0: 117 measure_kanto(selected_kanto) 118 119 elif len(selected_kansai) > 0: 120 measure_kansai(selected_kansai) 121 122def measure_kanto(kanto): 123 for kt in kanto: 124 print('人口を測定中') 125 print("測定終了") 126 127def measure_kansai(kansai): 128 for ks in kansai: 129 print('人口を測定中') 130 print("測定終了") 131 132def quit(): 133 root.destroy() 134 135 136btn1 = ttk.Button(Lframe2, text='全選択', padding=5, command=check_all_kanto_checkboxes) 137btn1.grid(row=5,column=0,pady=5) 138 139btn2 = ttk.Button(Lframe2, text='全解除', padding=5, command=clear_all_kanto_checkboxes) 140btn2.grid(row=5,column=1,pady=5) 141 142btn3 = ttk.Button(Lframe3, text='全選択', padding=5, command=check_all_kansai_checkboxes) 143btn3.grid(row=5,column=0,pady=5) 144 145btn4 = ttk.Button(Lframe3, text='全解除', padding=5, command=clear_all_kansai_checkboxes) 146btn4.grid(row=5,column=1,pady=5) 147 148btn5 = ttk.Button(text='測定開始', padding=5, command=check_box) 149btn5.grid(row=5,column=0,pady=5) 150 151btn6 = ttk.Button(text='キャンセル', padding=5, command=quit) 152btn6.grid(row=5,column=1,pady=5) 153 154selected_frame.set(-1) 155change_selected_frame() 156 157root.mainloop() 158

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

1つのプログラム内で Root Window である Tk()を2つ以上生成することは推奨されません。
サブウィンドウを作成したいのであれば、Tk()ではなくToplevel()をお使いください。

check_box関数は以下のように修正

Python

1def check_box(): 2 global checkbox 3 checkbox = Toplevel(root) 4 checkbox.title('停止') 5 checkbox.attributes("-topmost", True) 6 checkbox.geometry("600x300+660+400") 7 8 selected_kanto = [] 9 selected_kansai = [] 10 11 #以下は同じなので省略

quit関数は以下のように修正

Python

1def quit(): 2 global checkbox 3 checkbox.destroy()

上記の変更を行うことでtopmost属性が動作するようになるのではないでしょうか

投稿2019/10/31 00:50

magichan

総合スコア15898

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

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

3265462164

2019/10/31 03:48

いつもありがとうございます。 想定通りの動作です。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問