Як я можу створити просте поле для повідомлень у 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.