Как использовать Tkinter Entry как raw_input

Я пытаюсь создать графический интерфейс для сокета TCP, основная функция запрашивает адрес сервера и ждет ответа для продолжения. Это код

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

Теперь у меня есть запись из Tkinter под названием iTxt, чтобы получить ввод пользователя, и я использую метод get(), чтобы получить ввод, но результат не совпадает с raw_input() и я не могу понять, как подражать raw_input, Кто-нибудь может мне помочь?
Спасибо

2 ответа

Если это выполняется внутри существующего графического интерфейса, вы можете создать модальное диалоговое окно с Toplevel, используя метод wait_window блокировать, пока окно не будет разрушено. Если вы хотите использовать всплывающее окно в другой программе без графического интерфейса, вы можете создать небольшую автономную программу 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)

Если у вас уже работает графический интерфейс, вы можете заменить tk.Tk() с tk.Toplevel() создать всплывающее окно, а затем использовать .wait_window() скорее, чем .mainloop() ждать, пока окно не будет уничтожено.

Вы можете использовать этот код:

from tkinter import *
#this is the main window

window = Tk()
#here is our function


def entry_input(prompt):
    #our frame to encapsulate our prompt and entry
    frame = Frame(window)
    #our label with our prompt
    label = Label(frame, text=prompt)
    #the variable to store the text
    text = StringVar()
    #the entry widget
    entry = Entry(window, textvariable=text)
    #show our label and entry
    label.pack()
    entry.pack()
    #return the text provided by the user
    return text.get()

my_input = entry_input("provide some text:")
#do something with the text 

#finally run the application
window.mainloop()

Объяснение этого кода в комментариях.

Вы не можете полностью эмулировать raw_input в tkInter, так как tkInter управляется событиями. Когда вы используете raw_input, выполнение программы блокируется, пока вы не введете ввод и не нажмете ввод. Когда вы используете get (), вы все равно получите ввод, даже если ваша запись еще пуста.

Самый простой способ получить какое-то блокирующее поведение - использовать модальное диалоговое окно. Но лучший способ - погрузиться в программирование, управляемое событиями. Если что-то вводится (и, вероятно, нажата OK), событие запускается TkInter. В качестве реакции на это событие вы вызываете функцию-обработчик события, обрабатывающую ввод.

Все GUI используют программирование на основе событий, поэтому стоит потратить (совсем) время.

Другие вопросы по тегам