python - 从文本框到屏幕的tkinter打印

时间:2017-10-21 18:04:48

标签: python python-3.x tkinter tkinter-entry

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

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

1 个答案:

答案 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问题,但有其他问题的评论可能会令人困惑。请尝试一次提出一个问题,以便为这个问题选择最佳答案)

现在我只是重新写了一下看起来更像是一个更好的答案。看一下使用gridpack与此无关。我希望你觉得它很有教育意义。注意不同的进口。您可以以不同方式导入,但这样您就不会导入所有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()