Domanda

Python ha molte librerie GUI: tkinter, wxWidgets, pyGTK ecc. Ma tutte queste GUI devono essere installate e abbastanza pesanti, quindi è un po 'complesso implementare app Python GUI per l'utente finale che trasmettono su librerie GUI menzionate.

Di recente, ho pensato al modulo ctypes integrato di Python. Teoricamente, è possibile creare una libreria GUI in vero pitone che utilizzerà ctypes su windows ( windll.user32.CreateWindowEx , ecc.), PyObjC nativo su MacOS e pyGTK / pyQt su gnome / kde. Esiste una biblioteca del genere? In caso contrario, cosa pensi che sia sbagliato in questa idea?

È stato utile?

Soluzione

Il percorso del minimo sforzo e dei migliori risultati sarebbe quello di imparare cosa serve per distribuire un'app usando quelle librerie GUI esistenti.

Altri suggerimenti

a partire da Python 2.7 e 3.1, Tk avrà un aspetto molto migliore.

http: //docs.python. org / dev / whatsnew / 2.7.html # TTK-tema-widget-per-tk

"Tcl / Tk 8.5 include un set di widget a tema che reimplementano i widget Tk di base ma hanno un aspetto più personalizzabile e possono quindi assomigliare più da vicino ai widget della piattaforma nativa. Questo set di widget era originariamente chiamato Tile, ma è stato rinominato in Ttk (per & # 8220; Tk a tema & # 8221;) dopo essere stato aggiunto alla versione 8.5 di Tcl / Tck. & Quot;

Tkinter fa parte della distribuzione standard di Python ed è installato di default. Aspettati di trovarlo su tutte le installazioni di Python in cui è presente un display grafico in primo luogo.

Nozione di "pure guy python gui library" è sbagliato perché alla fine utilizzerai chiamate e widget a livello di sistema, potrebbe essere attraverso i tipi, ma ciò non cambia il fatto che se inizi a implementare la tua idea alla fine diventerai wxPython

Principalmente ciò che non va è che sta reinventando le ruote che sono già state fatte dai produttori di GTK, Tk, Wx, QT e loro simili. Mentre una GUI in puro pitone è tecnicamente fattibile e progetti come anygui hanno tentato qualcosa di simile, c'è relativamente poco da guadagnare facendo questo.

I toolkit nativi faranno anche un lavoro migliore nel coprire le differenze tra le piattaforme sottostanti (dialoghi nativi ecc.). Ciò significa che i toolkit ti consentono di scrivere un'applicazione portatile che ha bisogno di poco se nessun codice specifico della piattaforma - la maggior parte di questo è astratta dal toolkit sottostante.

Meccanismi di distribuzione come py2exe su Windows e uno qualsiasi dei metodi linux consentono di raggruppare DLL con l'applicazione, in modo da poter creare un programma di installazione che elimini tutti i componenti nativi necessari. Tuttavia, non esiste davvero un modo multipiattaforma generico per farlo, quindi sarà necessario mantenere installatori separati per ogni piattaforma.

Per prima cosa, tutte quelle librerie usano astrazioni diverse, quindi tutto ciò che ha funzionato con tutte è probabile che finisca per supportare un set di funzionalità dal minimo comune denominatore, o facendo MOLTE lavorare per sfruttarli al meglio.

Non sono davvero sicuro di cosa intendi per "pesi massimi."

wx utilizza controlli nativi su ciascuna piattaforma ed è facile da usare in Python come posso immaginare; dopo tutto, le API della GUI sono complesse perché le GUI possono diventare complesse.

Penso che, per lo sforzo richiesto per costruire una finestra e la qualità di ciò che appare sullo schermo, è fantastico. Non penso che probabilmente farai qualcosa di meglio da solo.

Penso che non si stia inventando la ruota. Funzionerebbe, ma perché dovresti farlo? Tutte le librerie GUI che hai citato sono stabili e più o meno a prova di proiettile.

Potrei immaginare che ci siano alcuni esperimenti che implementano una libreria di puro pitone. Ma non ne ho mai visto uno. Tutto sulle GUI è un duro lavoro e una libreria Python pura non avrebbe un pubblico così grande.

Che ne dici di un involucro leggero attorno a tkinter in modo che non richieda molta configurazione? PySimpleGUI è costruito su tkinter, il che significa che funziona ovunque.

Il vantaggio rispetto all'utilizzo rispetto a tkinter è la quantità di codice richiesta. I programmi PySimpleGUI tendono ad essere davvero compatti.

Ecco un esempio che mostra un layout personalizzato che utilizza molti dei widget disponibili.

 inserisci qui la descrizione dell'immagine

Il codice per generarlo è alla fine. Potrebbe sembrare un sacco di codice, ma il gioco è fatto. Servirebbero pagine e pagine e pagine di codice tkinter per fare la stessa cosa.

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top