Какой самый простой кроссплатформенный способ для всплывающих графических диалогов в Python? - PullRequest
37 голосов
/ 28 октября 2009

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

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

Для всплывающего простого стандартного диалога требуется только минимальный код. По сути, вы просто говорите «Вызовите стандартный диалог с этим текстом» или «Вызовите диалог с вопросом x и введите ответ в переменную y».

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

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

и после того, как они введут в поле и нажмут Ok, response теперь равно 'bananas.txt'. Никакого другого кода не требуется. Нет плохой командной строки для плохого пользователя.

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

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

Ответы [ 10 ]

22 голосов
/ 28 октября 2009

EasyGUI представляет собой один файл и предоставляет простой способ работы с диалогами Tkinter, но они по-прежнему уродливые не родные диалоги Tkinter.

from easygui import msgbox
msgbox('Stuff')

Tkinter is ugly on Ubuntu TKinter is ugly on Windows 7

Может быть легко установлен с помощью:

$ sudo pip3 install --upgrade easygui

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

Ранее существовал также форк EasyGuiTtk , который, к сожалению, более недоступен.

enter image description here

14 голосов
/ 28 октября 2009

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 Gnome Zenity looks good in KDE, too, suprisingly Zenity in Windows has the wrong GTK theme

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

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

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

12 голосов
/ 28 октября 2009

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

# File: hello1.py

from Tkinter import *

root = Tk()

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

root.mainloop()

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

8 голосов
/ 04 сентября 2014

Модуль PyMsgBox делает это почти точно. Он использует встроенный модуль tkinter для своих функций окна сообщений, которые следуют соглашениям именования 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/

8 голосов
/ 21 февраля 2011

Расширение ответа tkMessageBox от Endolith с уродливым пустым окном на заднем плане ...

Приведенный ниже код появляется во всплывающем окне без фонового окна.

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

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

6 голосов
/ 03 ноября 2009

@ endolith, re: zenity для Windows.

Привет

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

Скриншот:

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

Мир, Руслан

5 голосов
/ 05 ноября 2009

wxPython является лучшей библиотекой Python GUI (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()
3 голосов
/ 31 октября 2009

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

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

Tkinter is super ugly

1 голос
/ 28 октября 2009

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()
0 голосов
/ 05 ноября 2009

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

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

...