2017-10-21 4 views
0

をスクリーニングするためのテキストボックスからTkinterのプリント、私はボタンをクリックするたびにスクリーニングするためのテキストボックスからテキスト入力を印刷しようとしています。これは、のpython - 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

編集:

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で尋ねたとして、古いウィンドウの選択を制限するように、私はnewwin()に行を追加することを提案コードの書き直し私は既にOPの質問に答えたと思うが、追加の質問のコメントは混乱する可能性がある。質問のベストアンサーを選択するために一度に1つの質問をしてみてください)

ものを書き直しただけだより一流の答えのように見える。ここでは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() 
+0

上記の答えに説明を追加しました。 – progmatico

+0

古いウィンドウの選択を制限するにはどうすればよいですか? 新しいウィンドウ(Toplevel)を閉じるまで、古いウィンドウを選択できないはずです.... どうすればいいですか? – Franky

+0

'newwin()'メソッドの最後の命令として 'win.grab_set()'を追加します。新しいウィンドウがすべてのイベントをキャプチャします。 プリント(s.get()) デフnewwinを(): 勝利=トップレベル() S = STRINGVAR() ボタン=ボタン(勝利、テキスト= 'クリックTkinterのインポート* デフ取得(複数可)から – progmatico