2017-10-21 67 views
0

在Tkinter的,我试图以打印文本框中的文本输入我按一下按钮,每次筛选“单击”蟒蛇 - Tkinter的从文本框中打印到屏幕

这是我的代码是工作的罚款

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() 

每次我点击“点击”按钮的代码中,我看到一个空行...... 但我想看到的输出就像前面的情况。 在此先感谢!

回答

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问题,但是带有附加问题的评论可能会让您感到困惑,请尝试一次提出一个问题,以便您为该问题选择最佳答案)

现在我只是重写了这个东西看起来像一个更加平庸的答案。看看使用gridpack在这里不相关。我希望你觉得它很有教育意义。注意不同的进口。您可以以不同方式导入,但这种方式不会导入所有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() 
+0

刚添加上述答案的解释。 – progmatico

+0

如何限制选择旧窗口? 直到我关闭新窗口(Toplevel)我不应该能够选择旧的窗口.... 我该怎么做? – Franky

+0

在'newwin()'方法中添加'win.grab_set()'作为最后一条指令。新窗口将捕获所有事件。 – progmatico