変更
def newwin():
win=Tk()
...
def newwin():
win=Toplevel(root)
...
編集(明確化)へ:
あなたは
に
def newwin():
win=Tk()
s=StringVar()
...
を変更した場合、あなたのコードも実行します
def newwin():
win=Tk()
s=StringVar(win)
...
複数のTk()インスタンスを実行しないでください。良い説明を参照してくださいhere
編集:
def newwin():
win=Tk(Toplevel(root))
s=StringVar()
button=Button(win,text='click',command=lambda:get(s)).grid(row=1)
ent=Entry(win,textvariable=s).grid()
win.grab_set() # win will catch all events, until you close it
# so user cannot interact with root window widgets
# root.widthdraw() # alternative approach hides root window
# until Toplevel closes
root=Tk()
but=Button(root,text='New',command=newwin).grid()
編集: (さらなる強化をして コメントにOPで尋ねたとして、古いウィンドウの選択を制限するように、私はnewwin()
に行を追加することを提案コードの書き直し私は既にOPの質問に答えたと思うが、追加の質問のコメントは混乱する可能性がある。質問のベストアンサーを選択するために一度に1つの質問をしてみてください)
ものを書き直しただけだより一流の答えのように見える。ここではgrid
またはpack
を使用することは関係ありません。私はあなたがそれが教育的だと思っています。異なる輸入品に注目してください。インポートは異なっても構いませんが、このようにしてモジュール名tkinter
をすべてインポートする必要はありません。 ttk
ウィジェットは、古典的なもののちょうど現代版です。私はToplevel
をサブクラス化し、親が__init__
と呼ばれ、そのクラスに新しいウィンドウ関連のものがまとめられていることを保証します。 grab_set
の使用と、子のトップレベルがフォーカスを失ったときのイベントコールバックにも注意してください。あなたが子供を閉じない限り、この方法ではルートウィンドウはフォーカスを取り戻しません。したがって、ウィンドウを選択する必要はありません。これは選択された回答から適応されましたhere
私は新しく作成されたウィンドウへの参照を保持しないことにも注意してください。もし必要ならば、適応する必要があります(おそらくMyWinddow(root)
の結果をグローバル変数に格納する必要があります)
import tkinter as tk
from tkinter import Tk, ttk
class MyWindow(tk.Toplevel):
def __init__(self, parent, *kw):
super().__init__(parent, *kw)
self.title('New Toplevel Window')
self.myvar = tk.StringVar()
self.button = ttk.Button(self, text='Print myvar',
command=self.print_myvar)
self.entry = ttk.Entry(self, textvariable=self.myvar)
self.button.pack(pady=5)
self.entry.pack(padx=50, pady=5)
self.grab_set() # capture all the events
self.bind('<FocusOut>', self.dont_let_focus_go) # cannot focus root
def print_myvar(self):
print(self.myvar.get())
def dont_let_focus_go(self, event=None):
self.focus_force()
def new_window():
MyWindow(root)
root = Tk()
root.title('My Application Root Window')
button = ttk.Button(root, text='New Window', command=new_window)
button.pack(padx=50, pady=5)
root.mainloop()
上記の答えに説明を追加しました。 – progmatico
古いウィンドウの選択を制限するにはどうすればよいですか? 新しいウィンドウ(Toplevel)を閉じるまで、古いウィンドウを選択できないはずです.... どうすればいいですか? – Franky
'newwin()'メソッドの最後の命令として 'win.grab_set()'を追加します。新しいウィンドウがすべてのイベントをキャプチャします。 プリント(s.get()) デフnewwinを(): 勝利=トップレベル() S = STRINGVAR() ボタン=ボタン(勝利、テキスト= 'クリックTkinterのインポート* デフ取得(複数可)から – progmatico