改变
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 问题,但是带有其他问题的 cmets 可能会造成混淆。请尝试一次提出一个问题,以便您为该问题选择最佳答案)
现在我只是重写了这个东西,让它看起来像一个更连贯的答案。看这里使用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()