2016-08-02 73 views
0

我想創建一個TCP套接字的圖形用戶界面,主要功能要求服務器地址,並等待一個答案繼續。這是代碼如何使用像raw_input Tkinter條目

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

現在,我已經從一個Tkinter的入門叫iTxt獲取用戶輸入,我使用get()方法來獲取輸入,但結果是不一樣的一個raw_input()可以和我不知道如何效仿raw_input。有人能幫我嗎?
謝謝

+0

究竟是什麼'raw_input'的功能從您希望模擬的'tk.Entry'小部件中丟失? – martineau

+0

@martineau:我的猜測是OP想要一個可調用的塊,直到用戶輸入一個字符串。 –

+0

正是我想要的,如果我使用get()函數繼續,即使條目是空的。我希望函數等待用戶在鍵盤上按回車 – LoreSchaeffer

回答

-1

您不能完全模擬tkInter中的raw_input,因爲tkInter是事件驅動的。當你使用raw_input時,程序執行塊直到你提供輸入並按回車。當你使用get()時,無論如何你都會得到輸入,即使你的輸入仍然是空的。

獲得某種阻塞行爲的最簡單方法是使用模態對話框。但最好的方法是深入到事件驅動的編程。如果有東西被輸入(並且可能按下OK),TkInter會觸發一個事件。作爲對此事件的反應,您可以調用處理輸入的事件處理函數。

所有的圖形用戶界面都使用事件驅動的編程,所以它付出了相當的時間。

+1

我認爲_「您無法完全模擬tkInter中的raw_input,因爲tkInter是事件驅動的」_爲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.Tk()tk.Toplevel()創建一個彈出窗口,然後用.wait_window()而比.mainloop()等待窗戶被銷燬。

+0

這可能是一個有效的可能性,但它會過時,因爲這個程序需要輸入的用戶來獲得一個像在shell中的答案 – LoreSchaeffer

+0

@LoreSchaeffer:我不明白你的意見。當你調用這個函數時,它會彈出一個窗口並等待用戶輸入一些數據。這不正是你想要的嗎? –

+0

我不能打開彈出evry時間,我不得不添加一個命令 – LoreSchaeffer