在tkinter中,每次点击按钮时,我都会尝试将文本框从文本框打印到屏幕,然后单击“#34;
这是我的代码,工作正常
from tkinter import *
def get(s):
print(s.get())
win=Tk()
s=StringVar()
button=Button(win,text='click',command=lambda:get(s)).grid(row=1)
ent=Entry(win,textvariable=s).grid()
但是当我从新窗口做同样的事情时,它无法正常工作。 这是不起作用的代码
from tkinter import *
def get(s):
print(s.get())
def newwin():
win=Tk()
s=StringVar()
button=Button(win,text='click',command=lambda:get(s)).grid(row=1)
ent=Entry(win,textvariable=s).grid()
root=Tk()
but=Button(root,text='New',command=newwin).grid()
每次点击“点击”按钮按钮,我看到一个空行...... 但我希望看到输出就像前面的情况一样。 在此先感谢!!
答案 0 :(得分:2)
更改
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
模块名称。 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()