Как я могу создать простое окно сообщения в Python? - PullRequest
94 голосов
/ 03 июня 2010

Я ищу тот же эффект, что и alert() в JavaScript.

Сегодня днем ​​я написал простой веб-интерпретатор, используя Twisted.web. Вы в основном отправляете блок кода Python через форму, и клиент приходит и берет его и выполняет. Я хочу иметь возможность сделать простое всплывающее сообщение, без необходимости переписывать каждый раз целый набор шаблонного кода wxPython или TkInter (так как код передается через форму, а затем исчезает).

Я пробовал tkMessageBox:

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

но при этом открывается другое окно в фоновом режиме со значком tk. Я не хочу этого Я искал какой-то простой код wxPython, но он всегда требовал установки класса, запуска цикла приложения и т. Д. Нет ли простого способа безошибочной обработки создать окно сообщения в Python?

Ответы [ 13 ]

205 голосов
/ 07 марта 2013

Вы можете использовать импорт и однострочный код, например так:

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

Или определить функцию (Mbox) следующим образом:

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)

Обратите внимание на следующие стили:

##  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

Веселись!

Примечание: отредактировано для использования MessageBoxW вместо MessageBoxA

47 голосов
/ 03 июня 2010

Вы смотрели на easygui ?

import easygui

easygui.msgbox("This is a message!", title="simple gui")
21 голосов
/ 16 июля 2011

Также вы можете расположить другое окно перед тем, как отозвать его, чтобы разместить ваше сообщение

#!/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!")
19 голосов
/ 26 августа 2010

Код, который вы представили, в порядке! Вам просто нужно явно создать «другое окно в фоновом режиме» и спрятать его с помощью этого кода:

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

Прямо перед вашим сообщением.

9 голосов
/ 03 июня 2010

В Mac стандартная библиотека python имеет модуль EasyDialogs. Существует также (на основе ctypes) версия для Windows на http://www.averdevelopment.com/python/EasyDialogs.html

Если это важно для вас: он использует собственные диалоговые окна и не зависит от Tkinter, как уже упоминалось easygui, но он может иметь не так много возможностей.

9 голосов
/ 03 июня 2010

В Windows вы можете использовать ctypes с библиотекой user32 :

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")
7 голосов
/ 04 сентября 2014

Модуль PyMsgBox делает именно это. Он имеет функции окна сообщений, которые соответствуют соглашениям об именах JavaScript: alert (), verify (), prompt () и password () (который является prompt (), но использует * при вводе) Эти функциональные вызовы блокируются, пока пользователь не нажмет кнопку OK / Отмена. Это кроссплатформенный, чистый модуль Python без каких-либо зависимостей.

Установить с помощью: pip install PyMsgBox

Пример использования:

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

Полная документация на http://pymsgbox.readthedocs.org/en/latest/

5 голосов
/ 19 января 2018
import ctypes
ctypes.windll.user32.MessageBoxW(0, "Your text", "Your title", 1)

Последний номер (здесь 1) можно изменить, чтобы изменить стиль окна (не только кнопки!):

## 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

Например,

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

даст это :

enter image description here

1 голос
/ 11 марта 2014
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 
1 голос
/ 22 декабря 2013

Используйте

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

Главное окно должно быть создано ранее. Это для Python 3. Это не для wxPython, а для tkinter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...