Carson Myers
Carson Myers

Reputation: 38564

How can I create a simple message box in Python?

I'm looking for the same effect as alert() in JavaScript.

I wrote a simple web-based interpreter this afternoon using Twisted Web. You basically submit a block of Python code through a form, and the client comes and grabs it and executes it. I want to be able to make a simple popup message, without having to rewrite a whole bunch of boilerplate wxPython or Tkinter code every time (since the code gets submitted through a form and then disappears).

I've tried tkMessageBox:

import tkMessageBox
tkMessageBox.showinfo(title="Greetings", message="Hello, World!")

but this opens another window in the background with the Tkinter icon. I don't want this. I was looking for some simple wxPython code, but it always required setting up a class and entering an application loop, etc. Isn't there a simple, catch-free way of making a message box in Python?

Upvotes: 179

Views: 556127

Answers (18)

William Bell
William Bell

Reputation: 39

ctype module with threading

I was using the Tkinter message box, but it would crash my code. I didn't want to find out why, so I used the ctypes module instead.

For example:

import ctypes

ctypes.windll.user32.MessageBoxW(0, "Your text", "Your title", 1)

I got that code from Arkelis.


I liked that it didn't crash the code, so I worked on it and added a threading so the code after would run.

Example for my code

import ctypes
import threading


def MessageboxThread(buttonstyle, title, text, icon):
    threading.Thread(
        target=lambda: ctypes.windll.user32.MessageBoxW(buttonstyle, text, title, icon)
    ).start()

messagebox(0, "Your title", "Your text", 1)

For button styles and icon numbers:

## Button styles:
# 0 : OK
# 1 : OK | Cancel
# 2 : Abort | Retry | Ignore
# 3 : Yes | No | Cancel
# 4 : Yes | No
# 5 : Retry | No
# 6 : Cancel | Try Again | Continue

## To also change icon, add these values to previous number
# 16 Stop-sign icon
# 32 Question-mark icon
# 48 Exclamation-point icon
# 64 Information-sign icon consisting of an 'i' in a circle

Upvotes: 2

Arkelis
Arkelis

Reputation: 953

Use:

import ctypes
ctypes.windll.user32.MessageBoxW(0, "Your text", "Your title", 1)

The last number (here 1) can be changed to change the window style (not only buttons!):

## Button styles:
# 0 : OK
# 1 : OK | Cancel
# 2 : Abort | Retry | Ignore
# 3 : Yes | No | Cancel
# 4 : Yes | No
# 5 : Retry | No
# 6 : Cancel | Try Again | Continue

## To also change icon, add these values to previous number
# 16 Stop-sign icon
# 32 Question-mark icon
# 48 Exclamation-point icon
# 64 Information-sign icon consisting of an 'i' in a circle

For example,

ctypes.windll.user32.MessageBoxW(0, "That's an error", "Warning!", 16)

will give this:

Enter image description here

Upvotes: 18

Jerry T
Jerry T

Reputation: 1690

Check out my Python module QuickGUI: pip install quickgui (it requires wxPython, but it doesn't require any knowledge of wxPython)

It can create any number of inputs (ratio, checkbox, and inputbox) and auto arrange them on a single GUI.

Upvotes: 0

Creuil
Creuil

Reputation: 9

It is not the best, but here is my basic message box using only Tkinter.

# Python 3.4
from tkinter import messagebox as msg;
import tkinter as tk;

def MsgBox(title, text, style):
    box = [
        msg.showinfo,    msg.showwarning, msg.showerror,
        msg.askquestion, msg.askyesno,    msg.askokcancel, msg.askretrycancel,
];

tk.Tk().withdraw(); # Hide the main window

if style in range(7):
    return box[style](title, text);

if __name__ == '__main__':

Return = MsgBox( # Use it like this:
    'Basic Error Example',

    ''.join([
        'The basic error example a problem with test',                   '\n',
        'and is unable to continue. The application must close.',        '\n\n',
        'Error code Test',                                               '\n',
        'Would you like visit http://wwww.basic-error-exemple.com/ for', '\n',
        'help?',
    ]),

    2,
);

print(Return);

Output:

Style    | Type        |  Button        |    Return
------------------------------------------------------
0          Info           Ok                'ok'
1          Warning        Ok                'ok'
2          Error          Ok                'ok'
3          Question       Yes/No            'yes'/'no'
4          YesNo          Yes/No            True/False
5          OkCancel       Ok/Cancel         True/False
6          RetryCancal    Retry/Cancel      True/False

Upvotes: -1

Robert
Robert

Reputation: 11

import sys
from tkinter import *

def mhello():
    pass
    return

mGui = Tk()
ment = StringVar()

mGui.geometry('450x450+500+300')
mGui.title('My YouTube Tkinter')

mlabel = Label(mGui, text ='my label').pack()

mbutton = Button(mGui, text ='ok', command = mhello, fg = 'red', bg='blue').pack()

mEntry = entry().pack

Upvotes: 1

HD1920
HD1920

Reputation: 11

Use

from tkinter.messagebox import *
Message([master], title="[title]", message="[message]")

The master window has to be created before. This is for Python 3. This is not for wxPython, but for Tkinter.

Upvotes: 1

Steven
Steven

Reputation: 28656

On Mac, the Python standard library has a module called EasyDialogs. There is also a (ctypes-based) Windows version at EasyDialogs for Windows 46691.0.

If it matters to you: it uses native dialogs and doesn't depend on Tkinter like the already-mentioned easygui, but it might not have as much features.

Upvotes: 11

deadPengwen
deadPengwen

Reputation: 19

If you want a message box that will exit if not clicked in time:

import win32com.client

WshShell = win32com.client.DispatchEx("WScript.Shell")

# Working Example BtnCode = WshShell.Popup("Next update to run at ", 10, "Data Update", 4 + 32)

# discriptions BtnCode = WshShell.Popup(message, delay(sec), title, style)

Upvotes: 0

Al Sweigart
Al Sweigart

Reputation: 12919

The PyMsgBox module does exactly this. It has message box functions that follow the naming conventions of JavaScript: alert(), confirm(), prompt() and password() (which is prompt() but uses * when you type). These function calls block until the user clicks an OK/Cancel button. It's a cross-platform, pure Python module with no dependencies outside of tkinter.

Install with: pip install PyMsgBox

Sample usage:

import pymsgbox
pymsgbox.alert('This is an alert!', 'Title')
response = pymsgbox.prompt('What is your name?')

Full documentation at http://pymsgbox.readthedocs.org/en/latest/

Upvotes: 16

user2140260
user2140260

Reputation: 3896

You could use an import and single line code like this:

import ctypes  # An included library with Python install.   
ctypes.windll.user32.MessageBoxW(0, "Your text", "Your title", 1)

Or define a function (Mbox) like so:

import ctypes  # An included library with Python install.
def Mbox(title, text, style):
    return ctypes.windll.user32.MessageBoxW(0, text, title, style)
Mbox('Your title', 'Your text', 1)

Note the styles are as follows:

##  Styles:
##  0 : OK
##  1 : OK | Cancel
##  2 : Abort | Retry | Ignore
##  3 : Yes | No | Cancel
##  4 : Yes | No
##  5 : Retry | Cancel 
##  6 : Cancel | Try Again | Continue

Have fun!

Note: edited to use MessageBoxW instead of MessageBoxA

Upvotes: 382

WinEunuuchs2Unix
WinEunuuchs2Unix

Reputation: 1929

I had to add a message box to my existing program. Most of the answers are overly complicated in this instance. For Linux on Ubuntu 16.04 (Python 2.7.12) with future proofing for Ubuntu 20.04 here is my code:

Program top

from __future__ import print_function       # Must be first import

try:
    import tkinter as tk
    import tkinter.ttk as ttk
    import tkinter.font as font
    import tkinter.filedialog as filedialog
    import tkinter.messagebox as messagebox
    PYTHON_VER="3"
except ImportError: # Python 2
    import Tkinter as tk
    import ttk
    import tkFont as font
    import tkFileDialog as filedialog
    import tkMessageBox as messagebox
    PYTHON_VER="2"

Regardless of which Python version is being run, the code will always be messagebox. for future proofing or backwards compatibility. I only needed to insert two lines into my existing code above.

Message box using parent window geometry

''' At least one song must be selected '''
if self.play_song_count == 0:
    messagebox.showinfo(title="No Songs Selected", \
        message="You must select at least one song!", \
        parent=self.toplevel)
    return

I already had the code to return if song count was zero. So I only had to insert three lines in between existing code.

You can spare yourself complicated geometry code by using parent window reference instead:

parent=self.toplevel

Another advantage is if the parent window was moved after program startup your message box will still appear in the predictable place.

Upvotes: 1

Some Guy
Some Guy

Reputation: 388

You can use pyautogui or pymsgbox:

import pyautogui
pyautogui.alert("This is a message box",title="Hello World")

Using pymsgbox is the same as using pyautogui:

import pymsgbox
pymsgbox.alert("This is a message box",title="Hello World")

Upvotes: 5

Hexiro
Hexiro

Reputation: 311

Also you can position the other window before withdrawing it so that you position your message

from tkinter import *
import tkinter.messagebox

window = Tk()
window.wm_withdraw()

# message at x:200,y:200
window.geometry("1x1+200+200")  # remember its.geometry("WidthxHeight(+or-)X(+or-)Y")
tkinter.messagebox.showerror(title="error", message="Error Message", parent=window)

# center screen message
window.geometry(f"1x1+{round(window.winfo_screenwidth() / 2)}+{round(window.winfo_screenheight() / 2)}")
tkinter.messagebox.showinfo(title="Greetings", message="Hello World!")

Please Note: This is Lewis Cowles' answer just Python 3ified, since tkinter has changed since python 2. If you want your code to be backwords compadible do something like this:

try:
    import tkinter
    import tkinter.messagebox
except ModuleNotFoundError:
    import Tkinter as tkinter
    import tkMessageBox as tkinter.messagebox

Upvotes: 3

AtomProgrammer
AtomProgrammer

Reputation: 254

A recent message box version is the prompt_box module. It has two packages: alert and message. Message gives you greater control over the box, but takes longer to type up.

Example Alert code:

import prompt_box

prompt_box.alert('Hello') #This will output a dialog box with title Neutrino and the 
#text you inputted. The buttons will be Yes, No and Cancel

Example Message code:

import prompt_box

prompt_box.message('Hello', 'Neutrino', 'You pressed yes', 'You pressed no', 'You 
pressed cancel') #The first two are text and title, and the other three are what is 
#printed when you press a certain button

Upvotes: 1

YOU
YOU

Reputation: 123791

In Windows, you can use ctypes with user32 library:

from ctypes import c_int, WINFUNCTYPE, windll
from ctypes.wintypes import HWND, LPCSTR, UINT
prototype = WINFUNCTYPE(c_int, HWND, LPCSTR, LPCSTR, UINT)
paramflags = (1, "hwnd", 0), (1, "text", "Hi"), (1, "caption", None), (1, "flags", 0)
MessageBox = prototype(("MessageBoxA", windll.user32), paramflags)

MessageBox()
MessageBox(text="Spam, spam, spam")
MessageBox(flags=2, text="foo bar")

Upvotes: 11

Lewis Cowles
Lewis Cowles

Reputation: 241

Also you can position the other window before withdrawing it so that you position your message

#!/usr/bin/env python

from Tkinter import *
import tkMessageBox

window = Tk()
window.wm_withdraw()

#message at x:200,y:200
window.geometry("1x1+200+200")#remember its .geometry("WidthxHeight(+or-)X(+or-)Y")
tkMessageBox.showerror(title="error",message="Error Message",parent=window)

#centre screen message
window.geometry("1x1+"+str(window.winfo_screenwidth()/2)+"+"+str(window.winfo_screenheight()/2))
tkMessageBox.showinfo(title="Greetings", message="Hello World!")

Upvotes: 24

Jotaf
Jotaf

Reputation: 517

The code you presented is fine! You just need to explicitly create the "other window in the background" and hide it, with this code:

import Tkinter
window = Tkinter.Tk()
window.wm_withdraw()

Right before your messagebox.

Upvotes: 23

Ryan Ginstrom
Ryan Ginstrom

Reputation: 14121

Have you looked at easygui?

import easygui

easygui.msgbox("This is a message!", title="simple gui")

Upvotes: 64

Related Questions