變化
def newwin():
win=Tk()
...
到
def newwin():
win=Toplevel(root)
...
編輯(澄清):
如果你改變
def newwin():
win=Tk()
s=StringVar()
...
到
您的代碼也將運行
def newwin():
win=Tk()
s=StringVar(win)
...
但是你不應該運行多個Tk()實例。見一個很好的解釋here
編輯: 爲了限制老窗口的選擇如要求在評論OP,我建議添加一行newwin()
:
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問題,但是帶有附加問題的評論可能會讓您感到困惑,請嘗試一次提出一個問題,以便您爲該問題選擇最佳答案)
現在我只是重寫了這個東西看起來像一個更加平庸的答案。看看使用grid
或pack
在這裏不相關。我希望你覺得它很有教育意義。注意不同的進口。您可以以不同方式導入,但這種方式不會導入所有tkinter
模塊名稱。小部件只是現代版本的經典版本。我分類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()'作爲最後一條指令。新窗口將捕獲所有事件。 – progmatico