2016-08-02 7 views
0

私はTCPソケット用のGUIを作成しようとしていますが、main関数はサーバアドレスを要求し、処理を続行するのを待ちます。この今私はTkinterのからのエントリーは、ユーザー入力を取得するためにiTxtと呼ばれており、私は入力を取得するメソッドget()を使用しますが、結果はraw_input()と同じではありませんし、私ができるコードraw_inputのようなTkinterエントリの使い方

print("Welcome to TCP Socket") 
address = raw_input("Insert server address: ") 
print("Connectiong to " + address) 
... 

ですどのようにraw_inputをエミュレートするのかわかりません。誰か助けてくれますか?
ありがとう

+0

'raw_input'のどの機能が、エミュレートしたい' tk.Entry'ウィジェットから抜けていますか? – martineau

+0

@martineau:私の推測では、OPは、ユーザが文字列を入力するまでブロックする呼び出し可能コードを必要としているということです。 –

+0

正確に何をしたいのですが、get()を使うと、その項目が空であっても関数が実行されます。私は関数がユーザーによるキーボードのReturnキーを押すのを待つことを望んでいます – LoreSchaeffer

答えて

-1

tkInterはイベントドリブンであるため、tkInterでraw_inputを完全にエミュレートすることはできません。 raw_inputを使用すると、入力を提供してEnterを押すまで、プログラムの実行がブロックされます。 get()を使うと、入力がまだ空であっても、何とか入力が得られます。

何らかの種類のブロック動作を取得する最も簡単な方法は、モーダルダイアログを使用することです。しかし、最善の方法は、イベント駆動型プログラミングに飛び込むことです。何かが入力された(おそらくOKが押された)場合、イベントはTkInterによってトリガされます。このイベントの反応として、入力を処理するイベントハンドラ関数を呼び出します。

すべてのGUIはイベント駆動型プログラミングを使用しているため、(かなり)時間を投資することになります。

+1

私は_ "tkInterはイベント駆動型であるため、tkInterでraw_inputを完全にエミュレートすることはできません" _はfalseです。あなたは入力を待つGUIを作成することができます。この非常に答えはあなたの答えを非常に混乱させるモーダルダイアログについて言及します。まず、あなたが言うことができない、あなたはできると言う。 –

+0

私はポイント – LoreSchaeffer

2

これが既存のGUI内で実行されている場合は、wait_windowを使用して、ウィンドウが破棄されるまでブロックするモーダルダイアログをToplevelで作成できます。そうでなければGUI以外のプログラムでポップアップウィンドウを使いたいなら、ルートウィンドウが破壊されたときに値を返す関数に自己完結型の小さなtkinterプログラムを作ることができます。

どちらの場合も、ウィンドウが破棄されるまで待ってから、ウィンドウ内の値をフェッチします。ウィンドウは破棄されているので、ウィンドウとともに破棄されないので、StringVarを使用する必要があります。ここで

にはGUIがすでに実行されていないと仮定し例です:

import tkinter as tk 

def gui_input(prompt): 

    root = tk.Tk() 
    # this will contain the entered string, and will 
    # still exist after the window is destroyed 
    var = tk.StringVar() 

    # create the GUI 
    label = tk.Label(root, text=prompt) 
    entry = tk.Entry(root, textvariable=var) 
    label.pack(side="left", padx=(20, 0), pady=20) 
    entry.pack(side="right", fill="x", padx=(0, 20), pady=20, expand=True) 

    # Let the user press the return key to destroy the gui 
    entry.bind("<Return>", lambda event: root.destroy()) 

    # this will block until the window is destroyed 
    root.mainloop() 

    # after the window has been destroyed, we can't access 
    # the entry widget, but we _can_ access the associated 
    # variable 
    value = var.get() 
    return value 

print("Welcome to TCP Socket") 
address = gui_input("Insert server address:") 
print("Connecting to " + address) 

すでに実行されているGUIを使用している場合は、ポップアップウィンドウを作成するためにtk.Toplevel()tk.Tk()を交換して、むしろ.wait_window()を使用することができます.mainloop()よりウィンドウが破棄されるのを待つ必要があります。

+0

これは有効な可能性がありますが、このプログラムはシェルのような答えを得るためにユーザーの入力が必要なのであまりにも時代遅れになるだろう – LoreSchaeffer

+0

@LoreSchaeffer:私はあなたのコメントを理解していません。この関数を呼び出すと、ウィンドウがポップアップし、ユーザーが何らかのデータを入力するのを待ちます。それはまさにあなたが望むものではありませんか? –

+0

私はコマンドを追加する必要があるポップアップevryの時間を開くことができません – LoreSchaeffer

関連する問題