2017-10-21 89 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