I want to create an on-screen input box that a user can interact with.
The user would see a window with an input field they can click with the mouse. The user could type or erase text in the field, then press OK once they have finished adding text. Lastly, my program would store this text for later use.
How can I create a text box in Python which allows user input?
You could try the Tkinter module:
from tkinter import *
master = Tk()
e = Entry(master)
e.pack()
e.focus_set()
def callback():
print e.get() # This is the text you may want to use later
b = Button(master, text = "OK", width = 10, command = callback)
b.pack()
mainloop()
Result:
Of course, you may want to read a Tkinter tutorial.
The Tk library actually has a function that does this although it is nominally 'private'. You can use it as follows.
import tkinter as tk
root = tk.Tk()
root.wm_geometry("800x600")
dialog = tk.Toplevel(root)
root_name = root.winfo_pathname(root.winfo_id())
dialog_name = dialog.winfo_pathname(dialog.winfo_id())
root.tk.eval('tk::PlaceWindow {0} widget {1}'.format(dialog_name, root_name))
root.mainloop()
This will place your dialog centred over the specified window (in this case the root window). Ref.
Here's a version I made because in real life you'll need to show an InputBox over the top of the Main Window/Form, and typically in a Modal (can't click on other windows) state, and then close it when the user clicks OK:
try:
# for Python2
import Tkinter as tk
except ImportError:
# for Python3
import tkinter as tk
class App:
def __init__(self):
self.HEIGHT = 700
self.WIDTH = 800
root = tk.Tk()
root.width = self.WIDTH
root.height = self.HEIGHT
self.dialogroot = root
self.strDialogResult = ""
self.canvas = tk.Canvas(root, height=self.HEIGHT, width=self.WIDTH)
self.canvas.pack()
frame = tk.Frame(root, bg='#42c2f4')
frame.place(relx=0.5, rely=0.02, relwidth=0.96, relheight=0.95, anchor='n')
# Here is the button call to the InputBox() function
buttonInputBox = tk.Button(frame, text="Input Box", bg='#cccccc', font=60,
command=lambda: self.InputBox())
buttonInputBox.place(relx=0.05, rely=0.1, relwidth=0.90, relheight=0.8)
root.mainloop()
def InputBox(self):
dialog = tk.Toplevel(self.dialogroot)
dialog.width = 600
dialog.height = 100
frame = tk.Frame(dialog, bg='#42c2f4', bd=5)
frame.place(relwidth=1, relheight=1)
entry = tk.Entry(frame, font=40)
entry.place(relwidth=0.65, rely=0.02, relheight=0.96)
entry.focus_set()
submit = tk.Button(frame, text='OK', font=16, command=lambda: self.DialogResult(entry.get()))
submit.place(relx=0.7, rely=0.02, relheight=0.96, relwidth=0.3)
root_name = self.dialogroot.winfo_pathname(self.dialogroot.winfo_id())
dialog_name = dialog.winfo_pathname(dialog.winfo_id())
# These two lines show a modal dialog
self.dialogroot.tk.eval('tk::PlaceWindow {0} widget {1}'.format(dialog_name, root_name))
self.dialogroot.mainloop()
#This line destroys the modal dialog after the user exits/accepts it
dialog.destroy()
#Print and return the inputbox result
print(self.strDialogResult)
return self.strDialogResult
def DialogResult(self, result):
self.strDialogResult = result
#This line quits from the MODAL STATE but doesn't close or destroy the modal dialog
self.dialogroot.quit()
# Launch ...
if __name__ == '__main__':
app = App()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With