Як я можу створити просте поле для повідомлень у Python?


119

Я шукаю той же ефект, що і alert()в JavaScript.

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

Я спробував tkMessageBox:

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

але це відкриє ще одне вікно на задньому плані із значком tk. Я цього не хочу. Я шукав простий код wxPython, але він завжди вимагав створення класу та введення циклу додатків тощо. Чи не існує простого способу створення вікна повідомлень у Python?

Відповіді:


257

Ви можете використовувати імпорт та однорядковий код на зразок цього:

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


2
Саме те, що я шукав. ОП теж від того, що це звучить. Слід зазначити як відповідь!
— CodeMonkey

3
Мех. Можливо, я заговорив занадто рано. Я отримую лише один символ як для заголовка, так і для повідомлення. Дивно ...
— CodeMonkey

18
Довелося використовувати MessageBoxW замість MessageBoxA.
— CodeMonkey

9
@CodeMonkey в python 3, використовуйте MessageBoxW замість MessageBoxA
— Олівер Ні

2
Примітка: Моє спливаюче вікно не було англійською мовою, і це можна виправити, прочитавши відповідь користувача Бурхана Халіда
— Арі

50

Ви подивилися на easygui ?

import easygui

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

7
це не tkinter, це не поставляється за замовчуванням, дивно, хто зацікавлений у впровадженні такого простого функціоналу, щоб привести непотрібні залежності?
— Тебе

7
Насправді геканнт, easygui - це обгортка навколо ткінтера. Так, це додаткова залежність, але це єдиний файл python. Деякі розробники можуть подумати, що залежність варта цього для впровадження простого GUI.
— Райан Гінстром

22

Також ви можете розташувати інше вікно перед тим, як його зняти, щоб ви розташували своє повідомлення

#!/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!")

3
Чи є якийсь метод, щоб нам не потрібно обробляти кнопку ok у tkMessageBox, і вона обробляється автоматично?
— varsha_holla

@varsha_holla Це не так, як працює поле повідомлень. Можливо, ви захочете вивчити створення стандартного вікна з таймером.
— Келлі Елтон

19

Код, який ви подали, чудово! Вам просто потрібно явно створити "інше вікно у фоновому режимі" і приховати його за допомогою цього коду:

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

Прямо перед вашою скринькою повідомлень.


4
Мені довелося додати "window.destroy ()" до кінця цього, щоб змусити його чисто вийти.
— kuzzooroo

11

Модуль PyMsgBox робить саме це. У ньому є функції вікна повідомлень, які відповідають умовам іменування JavaScript: alert (), підтвердження (), prompt () та password () (який є prompt (), але використовує * при введенні). Ці функціональні дзвінки блокуються, поки користувач не натисне кнопку ОК / Скасувати. Це крос-платформний, чистий модуль 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/


дивно. ви пишете, що це не має залежностей, але коли я намагаюся його використовувати, він друкуєAssertionError: Tkinter is required for pymsgbox
— shitpoet

Я повинен змінити це: pymsgbox не має залежностей поза стандартною бібліотекою, до складу якої входить tkinter. В якій версії Python та на якій ОС ви працюєте?
— Al Sweigart

Вибачте, я noob в Python, я подумав, що всі вкладені файли python встановлені наскрізь pip, але насправді частина файлів встановлюється іншим способом - за допомогою менеджера системних пакетів. Тому я встановив python-tkза допомогою свого менеджера пакунків. Я використовую Python 2.7 на Debian.
— shitpoet

offtopic: але поле повідомлень, створене PyMsgBox / Tk, виглядає досить некрасиво на моєму Debian
— shitpoet

10

У 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")

9

На Mac стандартна бібліотека python має модуль під назвою EasyDialogs. Також є версія (на основі типів) Windows за адресою http://www.averdevelopment.com/python/EasyDialogs.html

Якщо це важливо для вас: він використовує вбудовані діалоги та не залежить від Tkinter, як уже згадувалося easygui, але він може мати не так багато функцій.


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

дасть це :

введіть тут опис зображення


1

Використовуйте

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

Головне вікно потрібно створити раніше. Це для Python 3. Це не для wxPython, а для tkinter.


Дивіться мій коментар про "імпорт *" на відповідь Роберта.
— Юрген А. Ерхард

1
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 

Крім того, будь ласка, за любов усіх PEP8 і пітонічних, відмовляйте себе від "імпорту *". Це погано, правда?
— Юрген А. Ерхард

1

Також ви можете розташувати інше вікно перед тим, як його зняти, щоб ви розташували своє повідомлення

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!")

Зверніть увагу: це відповідь Льюїса Каулса просто на Python 3ified, оскільки tkinter змінився з python 2. Якщо ви хочете, щоб ваш код був зворотним словом, сумісним, зробіть щось подібне:

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

0

Не найкраще, ось моє основне поле повідомлень із використанням лише 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 Main Window.

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

if __name__ == '__main__':

Return = MsgBox(#Use Like This.
    'Basic Error Exemple',

    ''.join( [
        'The Basic Error Exemple 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 );

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

Ви імпортуєте форматування повністю бонкери. Ви старий програміст COBOL або FORTRAN? ;-)
— Юрген А. Ерхард

0

перевірити мій модуль python: pip install quickgui (Потрібен wxPython, але не вимагає знань про wxPython) https://pypi.python.org/pypi/quickgui

Можна створити будь-яку кількість входів, (співвідношення, прапорець, поле вводу), автоматично упорядкувати їх на одному gui.


0

Нещодавня версія вікна повідомлень - це модуль підказки. Він має два пакети: попередження та повідомлення. Повідомлення дає вам більший контроль над коробкою, але потрібно тривати більше часу.

Приклад оповіщення:

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

Приклад коду повідомлення:

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

0

модуль ctype з різьбленням

я використовував скриньку повідомлень tkinter, але це зірве мій код. Я не хотів з'ясовувати, чому я натомість використав модуль ctypes .

наприклад:

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

я отримав цей код від Arkelis


мені сподобалось, що він не зламав код, тому я працював над ним і додав нарізку, щоб код після запуску.

Приклад мого коду

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)

для стилів кнопок та номерів значків:

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

0

Ви можете використовувати pyautoguiабо pymsgbox:

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

Використовувати pymsgboxте саме, що використовувати pyautogui:

import pymsgbox
pymsgbox.alert("This is a message box",title="Hello World")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.