Как использовать 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 используют программирование на основе событий, поэтому стоит потратить (совсем) время.