Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a popup message box with an Entry field

I want to create a popup message box which prompts user to enter an input. I have this method inside a class. I am basing my code on this guide by java2s.

class MyDialog:
    def __init__(self, parent):
        top = self.top = Toplevel(parent)

        Label(top, text="Value").pack()

        self.e = Entry(top)
        self.e.pack(padx=5)

        b = Button(top, text="OK", command=self.ok)
        b.pack(pady=5)

    def ok(self):
        print "value is", self.e.get()
        self.top.destroy()

root = Tk()
d = MyDialog(root)

root.wait_window(d.top)

But in this, top = self.top = Toplevel(parent) doesn't work for me.

I have a mockup of what I am trying to accomplish.

GUI mockup

My program structure looks something like this:

class MainUI:
   def__int__(self):
       ...
       self.initUI()

   def initUI(self):
       .......
       Popup = Button(self, text="Enter Value", command=self.showPopup)

   def showPopup(self):
       #create the popup with an Entry here

How can I create a message box in Python which accepts user input?

like image 697
Bharat Avatar asked Apr 04 '12 23:04

Bharat


People also ask

How do you make a pop up message in Python?

In order to create a Python popup message, you can use Tkinter message prompts. First, you need to import the Tkinter package to use this method. The Tkinter message box module offers different options and configurations.

How do you show error box in Python?

If you need to display the error messagebox in your application, you can use showerror("Title", "Error Message") method. This method can be invoked with the messagebox itself.


3 Answers

I'm a little confused about your two different blocks of code. Just addressing the first block of code, nothing happens because you never enter the mainloop. To do that, you need to call root.mainloop(). The typical way of doing this is to add a button to root widget and bind a callback function to the Button (which includes d=MyDialog() and root.wait_window(d.top))

Here's some basic code which I hope does what you want ...

from Tkinter import *
import sys

class popupWindow(object):
    def __init__(self,master):
        top=self.top=Toplevel(master)
        self.l=Label(top,text="Hello World")
        self.l.pack()
        self.e=Entry(top)
        self.e.pack()
        self.b=Button(top,text='Ok',command=self.cleanup)
        self.b.pack()
    def cleanup(self):
        self.value=self.e.get()
        self.top.destroy()

class mainWindow(object):
    def __init__(self,master):
        self.master=master
        self.b=Button(master,text="click me!",command=self.popup)
        self.b.pack()
        self.b2=Button(master,text="print value",command=lambda: sys.stdout.write(self.entryValue()+'\n'))
        self.b2.pack()

    def popup(self):
        self.w=popupWindow(self.master)
        self.b["state"] = "disabled" 
        self.master.wait_window(self.w.top)
        self.b["state"] = "normal"

    def entryValue(self):
        return self.w.value


if __name__ == "__main__":
    root=Tk()
    m=mainWindow(root)
    root.mainloop()

I get the value from the popupWindow and use it in the main program (take a look at the lambda function associated with b2).

Main window:

Main window

"Click me" window:

click me window

Main window while "click me" is open:

Main window with greyed out "click me"

like image 75
mgilson Avatar answered Oct 21 '22 06:10

mgilson


import tkinter as tk
from tkinter import simpledialog

ROOT = tk.Tk()

ROOT.withdraw()
# the input dialog
USER_INP = simpledialog.askstring(title="Test",
                                  prompt="What's your Name?:")

# check it out
print("Hello", USER_INP)

Enjoy ...

like image 23
Pruthvi Avatar answered Oct 21 '22 08:10

Pruthvi


I did it in Tkinter without any classes. I created a function that starts a new window.

popup.Tk()
popup.mainloop()

In that window there is an Entry field from where I get the text with a variable which value is: entry.get()

Then you can use that variable for whatever you need and it will take the text from that Entry field.

like image 2
Carlos Z. Bent Avatar answered Oct 21 '22 08:10

Carlos Z. Bent