Подтвердить что ты не робот

Какой простой кросс-платформенный способ вывести графические диалоги в Python?

Мне нужен самый простой способ вывести простые диалоги в сценарии Python. В идеале решение будет:

  • Работа с Windows, OS X, Gnome, KDE
  • Посмотрите, как родной диалог на любой ОС
  • Требовать минимальный код

Для отображения простого стандартного диалога требуется только минимальный код. По сути, вы просто говорите "всплываете стандартное диалоговое окно с этим текстом" или "всплываете диалоговое окно с вопросом x и ответ фида в переменную y".

Это для простых сценариев, которые в противном случае выполнялись бы в командной строке. Я не хочу знать о инфраструктуре графического интерфейса пользователя или должен установить код, который говорит: "Запустите нить GUI, зарегистрируйте обработчик событий, настройте некоторые свойства окна, запустите цикл" и т.д. Я не хочу устанавливать затем закройте окно или закройте окно. Я даю ему текст для ввода в окно и/или кнопки и/или флажки, он возвращает то, что пользователь нажал. Все остальное следует заботиться автоматически. Например:

message_box('File conversion complete')

для стандартного диалогового окна с кнопкой "ОК" или

balloon_tip('File conversion complete')

для всплывающего всплывающего окна системного лотка, или

format = button_box('Which file format do you want?', 'JPG', 'PNG')

и нажмите одну из двух кнопок, а затем format равно 'JPG' или

response = text_query('What would you like to name the file?')

и после того, как они напечатают в поле и нажмите "ОК", response теперь равно 'bananas.txt'. Никакой другой код не требуется. Отсутствие уродливой командной строки подсказывает бедному пользователю.

Я привел Zenity и EasyGUI в качестве примеров ответов, так как они похожи на то, что я хочу, но не идеально.

[Ранее задавали вопрос на форуме Python]

4b9b3361

Ответ 1

EasyGUI - это один файл и обеспечивает простой способ работы с диалогами Tkinter, но они все еще некрасивы, родные диалоги Tkinter.

from easygui import msgbox
msgbox('Stuff')

Tkinter is ugly on UbuntuTKinter is ugly on Windows 7

Его можно легко установить, используя:

$ sudo pip3 install --upgrade easygui

Существует репозиторий GitHub и документация очень аккуратно.

Раньше существовала также вилка EasyGuiTtk, которая, к сожалению, больше не доступна.

enter image description here

Ответ 2

Zenity работает под Linux и Windows и может вызываться из Python напрямую:

import os
os.system('zenity --info --text="Stuff"')

Возвращаемые значения из вопросительных блоков должны быть получены для действия, хотя это более сложный процесс, и вам нужно научиться взаимодействовать с подпроцессами и т.д.

Он также может быть использован с интерфейсом PyZenity, что упрощает сбор возвращаемых значений:

from PyZenity import InfoMessage
InfoMessage('Stuff')

Я протестировал PyZenity как в Ubuntu, так и в Windows XP, и он работает в обоих.

Zenity looks pretty good in GnomeZenity looks good in KDE, too, suprisinglyZenity in Windows has the wrong GTK theme

Я читал, что Zenity - только GTK+, но я попробовал это в Gnome и KDE, и это выглядит как в обоих. Однако порт для Windows не выглядит родным, потому что он использует неправильную тему GTK?

Есть и другие программы, такие как KDialog и Xdialog, которые могут быть сопряжены с аналогичным фронтэндом Python, которые могли бы проверить и посмотреть, какие программы доступны так, чтобы он автоматически позаботится обо всем? (Также есть внешний интерфейс Ruby для KDialog.)

Я не знаю, работает ли PyZenity под OS X.

Ответ 3

TkInter обычно поставляется с Python

# File: hello1.py

from Tkinter import *

root = Tk()

w = Label(root, text="Hello, world!")
w.pack()

root.mainloop()

Если вам нужно что-то более привычное, вам нужно будет установить что-то вроде wxpython

Ответ 4

Чтобы продлить на endolith tkMessageBox ответ с уродливым пустым окном в фоновом режиме...

В приведенном ниже коде появляется окно без фонового окна.

import Tkinter, tkMessageBox
root = Tkinter.Tk()
root.withdraw()
tkMessageBox.showinfo("my dialog title", "my dialog message")

Это снимается непосредственно из полезного комментария, который я нашел в нижней части этой статьи. Спасибо Джейсону (комментатору) и effbot.org.

Ответ 5

Модуль PyMsgBox делает почти это. Он использует встроенный модуль tkinter для своих функций окна сообщений, которые следуют соглашениям об именах JavaScript: alert(), confirm(), prompt() и password() (который является приглашением(), но использует * при вводе). Эти функциональные вызовы блокируются до тех пор, пока пользователь не нажмет кнопку "ОК/Отмена". Это кросс-платформенный, чистый модуль 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/

Ответ 6

@endolith, re: zenity для Windows.

Привет,

Я перепаковал "Zenity для Windows" и включил правильный файл темы GTK. Сейчас это выглядит намного лучше. :) Теперь он доступен для скачивания: http://www.placella.com/software/zenity/

Скриншот:

alt text
(источник: placella.com)

Мир, Руслан

Ответ 7

wxPython - лучшая библиотека графического интерфейса Python (IMO) и использует собственные виджеты.

import wx
app = wx.PySimpleApp()
dialog = wx.MessageDialog(None, 'wxPython is awesome!', 'Dialog Box', wx.OK|wx.ICON_INFORMATION)
dialog.ShowModal()
dialog.Destroy()
app.MainLoop()

Ответ 8

Другая возможность - модуль tkMessageBox, который, по-видимому, встроен в стандартную библиотеку и является кросс-платформенным, хотя это еще более уродливо чем остальные:

import tkMessageBox
tkMessageBox.showinfo('Title','Stuff') 

Tkinter is super ugly

Ответ 9

pyglet - еще одна альтернатива, хотя она может и не быть самой простой. что, будучи сказанным, он кросс-платформенный и зависит только от python, поэтому нет внешних зависимостей. этот факт сам по себе может быть достаточным основанием для использования его над другими.

и все это может легко обрабатывать мультимедиа, довольно удобно, если вы хотите отображать изображение или видео или что-то в этом роде.

приведенный ниже пример из документации...

#!/usr/bin/python
import pyglet
window = pyglet.window.Window()
label = pyglet.text.Label('Hello, world',
                      font_name='Times New Roman',
                      font_size=36,
                      x=window.width/2, y=window.height/2,
                      anchor_x='center', anchor_y='center')

@window.event
def on_draw():
    window.clear()
    label.draw()

pyglet.app.run()

Ответ 10

Это невозможно. Если вы хотите просто, то вы должны использовать Tkinter, потому что это то, что включено. Если Tkinter недостаточно хорош, вам придется выбирать и упаковывать графический интерфейс для каждой платформы отдельно.

Я предлагаю вам использовать Tkinter и обернуть части, которые вам нужны в классе, который будет еще проще использовать.