变化
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