Question

Python possède de nombreuses bibliothèques d'interface graphique: tkinter, wxWidgets, pyGTK, etc. Mais toutes ces interfaces graphiques doivent être installées et assez lourdes. Il est donc un peu complexe de déployer des applications python d'interface graphique utilisateur pour relayer les bibliothèques d'interface graphique mentionnées.

Récemment, j'ai pensé au module ctypes intégré de python. Théoriquement, il est possible de créer une bibliothèque d’interface graphique python pure qui utilisera ctypes sur les fenêtres ( windll.user32.CreateWindowEx , etc.), le pyObjC natif sur MacOS et le pyGTK / pyQt on gnome / kde. Une telle bibliothèque existe-t-elle? Si non, qu'est-ce qui ne va pas dans cette idée, selon vous?

Était-ce utile?

La solution

Pour obtenir le minimum d'effort et obtenir les meilleurs résultats, vous apprendrez ce qu'il faut faire pour déployer une application à l'aide de ces bibliothèques d'interface graphique existantes.

Autres conseils

à partir de Python 2.7 et 3.1, Tk sera beaucoup mieux.

http: //docs.python. org / dev / whatsnew / 2.7.html # ttk-themed-widgets-for-tk

"Tcl / Tk 8.5 inclut un ensemble de widgets thématiques qui réimplémentent les widgets Tk de base, mais ont une apparence plus personnalisable et peuvent donc ressembler davantage aux widgets de la plate-forme native. Ce jeu de widgets s'appelait à l'origine Tile, mais il a été renommé Ttk (pour le thème "Tk à thème" & # 8221;) lors de son ajout à la version 8.5 de Tcl / Tck. "

Tkinter fait partie de la distribution standard de Python et est installé par défaut. Attendez-vous à trouver ceci sur toutes les installations python où il existe un affichage graphique en premier lieu.

Notion de "bibliothèque pure python gui" est faux car vous utiliserez des widgets et des appels de niveau système, mais vous ne pouvez pas changer le fait que si vous commencez à implémenter votre idée, vous finirez par devenir wxPython

Ce qui ne va surtout pas, c’est qu’il réinvente les rouages ??déjà réalisés par les fabricants de GTK, Tk, Wx, QT et leurs semblables. Bien qu’une interface graphique en python pure soit techniquement réalisable et que des projets tels que anygui aient tenté de faire quelque chose de similaire, il y a relativement peu gagner en faisant cela.

Les boîtes à outils natives feront également un meilleur travail pour couvrir les différences entre les plates-formes sous-jacentes (dialogues natifs, etc.). Cela signifie que les kits d’outils vous permettent d’écrire une application portable ne nécessitant que peu ou pas de code spécifique à une plate-forme - la plupart de ces informations sont extraites par le toolkit sous-jacent.

Des mécanismes de distribution tels que py2exe sous Windows et l’une des méthodes linux vous permettent d’associer des DLL à l’application, de sorte que vous puissiez créer un programme d’installation qui supprime tous les composants natifs dont il a besoin. Cependant, il n’existe pas vraiment de méthode générique multiplateforme pour ce faire. Vous devrez donc installer des programmes d’installation distincts pour chaque plate-forme.

En premier lieu, toutes ces bibliothèques utilisent des abstractions différentes. Par conséquent, tout ce qui a fonctionné avec elles est susceptible de prendre en charge un ensemble de fonctionnalités ayant le plus petit dénominateur commun, ou faisant BEAUCOUP travailler pour utiliser chacun au maximum.

Vous ne savez pas vraiment ce que vous entendez par "poids lourd".

wx utilise des contrôles natifs sur chaque plate-forme et est aussi facile à utiliser en Python que je ne l'imagine; Après tout, les API graphiques sont complexes car elles peuvent être complexes.

Je pense que wx, pour l’effort requis pour construire une fenêtre et la qualité de ce qui apparaît à l’écran, est excellent. Je ne pense pas que vous êtes susceptible de rouler quelque chose de mieux par vous-même.

Je pense qu'il ne s'agit pas d'inventer la roue. Cela fonctionnerait, mais pourquoi devriez-vous faire cela? Toutes les bibliothèques d’interface graphique que vous avez mentionnées sont stables et plus ou moins protégées contre les balles.

J'imagine qu'il existe des expériences mettant en œuvre une bibliothèque python pure. Mais je n'en ai jamais vu. Tout ce qui concerne les interfaces graphiques est un travail difficile et une bibliothèque python pure n’aurait pas un public aussi vaste.

Que diriez-vous d’un wrapper léger autour de tkinter pour qu’il ne nécessite pas beaucoup d’installation? PySimpleGUI est construit sur le dessus de tkinter, ce qui signifie qu'il fonctionne partout où tkinter est exécuté.

L’avantage de l’utiliser par rapport à tkinter est la quantité de code requise. Les programmes PySimpleGUI ont tendance à être vraiment compacts.

Voici un exemple montrant une disposition personnalisée utilisant de nombreux widgets disponibles.

 entrer la description de l'image ici

Le code pour le générer est à la fin. Cela peut ressembler à beaucoup de code, mais c'est tout. Il faudrait des pages et des pages et des pages de code tkinter pour faire la même chose.

import PySimpleGUI as sg

sg.ChangeLookAndFeel('GreenTan')
# ------ Menu Definition ------ #
menu_def = [['&File', ['&Open', '&Save', 'E&xit', 'Properties']],
            ['&Edit', ['Paste', ['Special', 'Normal', ], 'Undo'], ],
            ['&Help', '&About...'], ]
# ------ Column Definition ------ #
column1 = [[sg.Text('Column 1', background_color='lightblue', justification='center', size=(10, 1))],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 1')],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 2')],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 3')]]

layout = [
    [sg.Menu(menu_def, tearoff=True)],
    [sg.Text('(Almost) All widgets in one Window!', size=(30, 1), justification='center', font=("Helvetica", 25), relief=sg.RELIEF_RIDGE)],
    [sg.Text('Here is some text.... and a place to enter text')],
    [sg.InputText('This is my text')],
    [sg.Frame(layout=[
    [sg.Checkbox('Checkbox', size=(10,1)),  sg.Checkbox('My second checkbox!', default=True)],
    [sg.Radio('My first Radio!     ', "RADIO1", default=True, size=(10,1)), sg.Radio('My second Radio!', "RADIO1")]], title='Options',title_color='red', relief=sg.RELIEF_SUNKEN, tooltip='Use these to set flags')],
    [sg.Multiline(default_text='This is the default Text should you decide not to type anything', size=(35, 3)),
     sg.Multiline(default_text='A second multi-line', size=(35, 3))],
    [sg.InputCombo(('Combobox 1', 'Combobox 2'), size=(20, 1)),
     sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85)],
    [sg.InputOptionMenu(('Menu Option 1', 'Menu Option 2', 'Menu Option 3'))],
    [sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)),
     sg.Frame('Labelled Group',[[
     sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25),
     sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=75),
     sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=10),
     sg.Column(column1, background_color='lightblue')]])],
    [sg.Text('_' * 80)],
    [sg.Text('Choose A Folder', size=(35, 1))],
    [sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'),
     sg.InputText('Default Folder'), sg.FolderBrowse()],
    [sg.Submit(tooltip='Click to submit this form'), sg.Cancel()]]

window = sg.Window('Everything bagel', default_element_size=(40, 1), grab_anywhere=False).Layout(layout)
button, values = window.Read()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top