2009-12-07 12 views
11

Sono uno studente universitario. Sono stato esposto a un paio di anni di programmazione di base a scuola. Fino ad ora ho una conoscenza di Core Java, Core Python e base C e C++.Come faccio a ottenere un po 'di programmazione GUI?

Ogni volta che inizio con qualche programmazione della GUI, così posso iniziare con un mio progetto, sono sconvolto dalla mole che deve essere fatta, dall'API da apprendere, dall'architettura MVC e da tutto ciò che i programmatori parlano , gestione degli eventi ecc. ecc.

Studiato e oscilla per un po '. Ho provato le mie mani su Qt e Gtk, non ho potuto trovare molta documentazione. Ho cercato di dare un senso a pygame. Finisco nello stesso posto, conoscendo il linguaggio principale.

Tkinter sul mio zenwalk Linux è interrotto, quindi non potrebbe mai avviarlo. Possiedo un libro su Python con Tkinter spiegato.

Ma io finisco nello stesso posto, con solo la comprensione di base della lingua.

Vuoi ricominciare, seriamente ora. Mi piacerebbe scegliere python. Come dovrei andare a studiare la programmazione GUI?

Ho bisogno di alcune risorse Internet e della direzione in modo da non finire nello stesso posto!

+1

programmazione grafica in Python? Sul serio? –

+1

@David Lively - Cosa c'è che non va cominciando da lì? Ovviamente è un principiante della grafica e sembra avere solo una conoscenza di base della programmazione (scusate se sbaglio). – gahooa

+1

Con la programmazione grafica, ti riferisci alla programmazione dell'interfaccia utente grafica? O intendi la computer grafica, come nei videogiochi e nei film d'animazione? –

risposta

5

Poiché sembra che tu voglia programmare la GUI Python, posso suggerire PyGTK?

Probabilmente è un buon punto di partenza per qualcuno che conosce Python e vorrebbe iniziare in piccolo su alcune applicazioni di base della GUI. GTK può essere complesso a volte, ma con PyGTK ci sono un sacco di app di esempio open source che puoi studiare, da semplici a complesse.

Modifica: Questo tutorial from LinuxJournal sembra piuttosto utile.

Modifica 2: Ecco the tutorial from PyGTK's site e another tutorial I randomly found from Google (sembra che tutto il blog sia piuttosto utile per quello che vuoi fare, in realtà). Infine, lo snippet nella parte inferiore di this page potrebbe essere utile, per gentile concessione dei forum di Ubuntu.

+0

Grazie Reynolds. Il tuo post è utile :) –

+0

Posso avere più risorse ed ebooks per pygtk ?? –

+0

Ho provato ad aggiungerne un altro, fammi sapere se chi aiuta. – Reynolds

2

Se state appoggiando di più per i giochi ...

suggerisco di installare Pygame e Python, e passare attraverso la loro tutorials. Scegli un gioco semplice o un progetto grafico e programmalo!

1

Cosa intendi per "Grafica"? Intendi la grafica di gioco o intendi semplicemente il codice dell'interfaccia utente (moduli, pagine web, quel genere di cose)? Nel caso della grafica di gioco, c'è un limite a come le cose semplici possono essere fatte, ma http://www.gamedev.net, ad esempio, ha tonnellate di articoli introduttivi su motori 2D e 3D. Per qualcosa di più lungo la linea di applicazioni, potresti semplicemente scaricare Visual Studio o Eclipse e passare un po 'di tempo a guardare il codice che viene generato automaticamente dai loro editor WYSIWYG.

0

Se hai già utilizzato pygame, tk, Qt e GTK, allora l'unica cosa che mi rimane è pyglet, che ammetto di non aver provato, ma ho letto in modo uniforme buone cose .

Ancora, più di ogni altra cosa sembra che tu abbia problemi ad attaccare con una struttura abbastanza a lungo da farla davvero.Posso consigliarti di iniziare con un piccolo progetto, come Pong o Breakout, e solo l'apprendimento quanto più necessario per realizzarlo? Una volta che hai finito una cosa, avrai un'idea della biblioteca, e proseguendo oltre, molto più facile.

0

qualunque lingua scegliate, dovrete affrontare i numerosi dettagli relativi alla programmazione della GUI. ciò è dovuto alla natura dell'ambiente basato su finestre solitamente utilizzato per la GUI.

ciò che può aiutarti ad avanzare rapidamente nello sviluppo di un'applicazione basata su GUI è meno la lingua e più l'IDE che usi. un buon IDE può fare una parte delle cose meno interessanti per te permettendoti di concentrarti sul quadro generale.

con C# in VS 2008 è tutto basato sulla scelta di elementi e metodi da caselle di elenco. è molto facile iniziare e avere un progetto di lavoro.
si può quindi provare a personalizzare l'applicazione per ottenere una migliore comprensione di che cosa sta succedendo dietro le quinte

2

per Python GUI mi piace wxPython (www.wxpython.org). È abbastanza facile iniziare con semplici controlli e layout. È anche multipiattaforma. Un sacco di tutorial là fuori. Basta cercare il tutorial su wxPython.

+0

Non l'ho usato da solo, ma ho spesso sentito parlare bene di wxPython. Questa potrebbe essere una buona soluzione alternativa per le tue esigenze se trovi PyGTK frustrante, anche se non posso darti alcuna esperienza di prima mano. – Reynolds

+0

wxPython è fantastico! Non l'ho usato da un po ', ma la documentazione era piuttosto incompleta. Ti ha costretto a tornare alla documentazione dell'API di wxWindows C++, che è un problema se non conosci il C++. –

0

Una delle più grandi GUI Python da cui si può studiare è la fonte di IDLE. Viene sempre con Python.

1

Per il lavoro GUI in generale:

Less is more

lavoro GUI (anche in contesti produttivi) è quanto di più divertente e produttivo come dipingere la Torre Eiffel con uno spazzolino da denti. Scegli un design minimale.

Evitare Stato Like The Plague

si fa a mettere nel vostro stato di GUI, o nel modello? Se lo metti nella GUI, ti confonderai con percorsi di codice ridondanti e inconsistenti. Se lo si inserisce nel modello, si rischia un sistema troppo complesso che non viene sincronizzato quando la GUI non riesce ad aggiornarsi dal modello. Entrambi fanno schifo.

wxPython

Se volete imparare wxPython, qui ci sono alcune trappole che ho notato:

Il tutorial

Utilizzare questo tutorial - http://wiki.wxpython.org/AnotherTutorial

E ' il migliore che ho trovato

Ma ricordarsi di alternare i numeri di riga, per incollare facilmente.

Eventi

Gli eventi sono un po 'come eccezioni, e sono utilizzati per rendere le cose interattivo.

In un programma di vaniglia pitone, si scrive qualcosa di simile:

def doit(i): 
     print 'Doing i = ',i 

for i in range(10): 
    doit() 

print 'Results = ',result 

In una GUI, si fa qualcosa di simile:

def doit(event): 
    print 'An event',event,'just happened!' 
    event.Skip() 

import wx 
app = wx.App() 
frame = wx.Frame(None, -1, 'The title goes here') 
frame.Bind(wx.EVT_KEY_DOWN, doit) 
frame.Show() 
app.MainLoop() 

Ogni volta che l'utente preme un tasto verso il basso, un evento sarà essere sollevato Poiché frame è legato alla manifestazione (frame.Bind(wx.EVT_KEY_DOWN, doit)), la funzione doit verrà chiamata con l'evento come parametro.

Stampa su stderr non è troppo caldo in una GUI, ma doit potrebbe anche richiamare una finestra di dialogo, o fare qualsiasi cosa che si desidera.

Inoltre, è possibile generare i propri eventi utilizzando i timer.

applicazioni, telai, finestre, pannelli, e Sizers

Tutto ha un genitore. Se viene generato un evento e il bambino non lo salta (usando event.Skip()), anche il genitore dovrà gestire l'evento. Questo è analogo alle eccezioni che portano a funzioni di livello superiore.

Un wx.App è come la funzione principale.

wx.Window non è usata. La roba ne eredita e ha tutti i metodi per ridimensionare e impaginare, ma non è necessario saperlo.

wx.Frame è un frame mobile, come la finestra principale di Firefox. Avrai il frame principale in un'applicazione di base. Se vuoi modificare più file, potresti averne di più. Un wx.Frame di solito non ha genitori.

wx.Panel fa parte di una finestra padre. Puoi avere diversi pannelli all'interno di una cornice. Un pannello può avere un wx.Frame come genitore o potrebbe essere figlio di un altro pannello.

wx.Sizers sono utilizzati per automaticamente pannelli di layout all'interno di frame (o altri pannelli).

Codice:

def doit1(event): 
    print 'event 1 happened' 

def doit2(event): 
    print 'event 2 happened' 

import wx 
app = wx.App() 
frame = wx.Frame(None, -1, 'The title goes here') 

panel_1 = wx.Panel(frame,-1,style=wx.SIMPLE_BORDER) 
panel_2 = wx.Panel(frame,-1,style=wx.SIMPLE_BORDER) 

panel_1.Bind(wx.EVT_KEY_DOWN, doit1) 
panel_2.Bind(wx.EVT_KEY_DOWN, doit2) 

panel_1.SetBackgroundColour(wx.BLACK) 
panel_2.SetBackgroundColour(wx.RED) 

box = wx.BoxSizer(wx.HORIZONTAL) 
box.Add(panel_1,1,wx.EXPAND) 
box.Add(panel_2,1,wx.EXPAND) 

frame.SetSizer(box) 

frame.Show() 

app.MainLoop() 

sono stato davvero male, e non usato pratiche OOP. Ricorda che anche se odi OO nella maggior parte dei contesti, la programmazione GUI è il luogo in cui OOP brilla davvero.

La MCV

non ottengo MCV. Non credo che tu abbia bisogno di un MCV. Penso che un framework MW (model-widget) stia bene.

Per esempio - 2 fotogrammi che modificare lo stesso pezzo di testo:

class Model(object): 
    def __init__(self): 
     self.value = 'Enter a value' 
     self.listeners = [] 

    def Add_listener(self,listener): 
     self.listeners.append(listener) 

    def Set(self,new_value): 
     self.value = new_value 
     for listener in self.listeners: 
      listener.Update(self.value) 


import wx 
app = wx.App() 

class CVFrame(wx.Frame): 
    def __init__(self, parent, id, title, model): 
     wx.Frame.__init__(self, parent, id, title, size = (100,100)) 
     self.button = wx.Button(self, -1, 'Set model value') 
     self.textctrl = wx.TextCtrl(self, -1,model.value) 
     self.button.Bind(wx.EVT_BUTTON,self.OnSet) 

     self.model = model 
     model.Add_listener(self) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.button,0,wx.EXPAND) 
     sizer.Add(self.textctrl,1,wx.EXPAND) 

     self.SetSize((300,100)) 
     self.SetSizer(sizer) 
     self.Center() 
     self.Show() 

    def OnSet(self,event): 
     self.model.Set(self.textctrl.GetValue()) 

    def Update(self,value): 
     self.textctrl.SetValue(value) 

model = Model() 
frame1 = CVFrame(None, -1, 'Frame 1',model) 
frame2 = CVFrame(None, -1, 'Frame 2',model) 
app.MainLoop() 

wxPython dispone di un quadro ascoltatore-abbonato, che è una versione migliore del modello ho appena abbozzato (usa arbitri deboli, gli ascoltatori così cancellati non vanno in giro, e così via), ma questo dovrebbe aiutarti a ottenere l'idea.

+1

Non dovrebbe essere MVC, non MCV? – Joel

1

So come ti senti - ho imparato un sacco di programmi per computer durante la mia laurea in CS ma molto poco su GUI. Ho finito per insegnarmi Cocoa/Objective-C per un progetto. Il cacao è meraviglioso per roba GUI, ma spesso un dolore reale con una curva di apprendimento ripida. Se non hai esperienza con la programmazione in C, non preoccuparti.

Primo passo: familiarizzare con la convenzione di progettazione MVC (Model/View/Controller), poiché quasi ogni framework GUI farà riferimento a esso. Google: ci sono molte risorse a riguardo. La mia definizione rapida e semplice è:

Il livello del modello definisce i dati o il modello logico dell'applicazione. Per un'app Web, questo sarebbe il database. Per un gioco, potrebbero essere memorizzati dati e logica/regole di gioco.

Il livello di visualizzazione è ciò che l'utente vede e interagisce con (la GUI).

Il livello del controller è la logica che collega i due. Ad esempio, il controller sa che quando fai clic sul pulsante "Inizia partita" nel livello di visualizzazione, fa alcune cose con il modello (ad esempio, impostando la scheda ei giocatori.)

Passo due: capire che cosa tu vuoi. Ti interessano in particolare le applicazioni desktop? Giochi? App Web?

Se per lo più ciò che si vuole fare è essere in grado di sviluppare qualcosa che le persone effettivamente utilizzerebbero, un'altra opzione è quella di apprendere un framework di sviluppo web. I framework rendono le cose facili per te. Adoro Django, personalmente, e se conosci un po 'di Python e un po' di HTML e un po 'di MVC, puoi riprenderlo velocemente. (Basta non essere confuso, perché quello che Django chiama una vista è in realtà un controller.)

Se quello che vuoi fare è giochi o grafica/animazione, controlla pygame. L'ho usato per un progetto di classe - in pratica l'ho insegnato a me stesso in un paio di settimane - e ha funzionato alla grande.

Direi di stare il più lontano possibile da Java Swing/awt/etc.

Ho sentito cose positive su wxPython - Ho quasi finito per usarlo al posto di Cocoa, perché il materiale wx è disponibile in diversi linguaggi di programmazione ed è tutto cross-platform.

Buona fortuna! Sii forte! So che è davvero intimidatorio, perché sono stato nei tuoi panni. Puoi farlo con un po 'di lavoro, pratica e motivazione.

+0

A proposito, perché stare lontano da Java Swing/awt/etc ?? –

+0

Nella mia esperienza, lo sviluppo di applicazioni GUI in Java è un enorme problema. È difficile creare un'interfaccia davvero bella, è difficile ottenere le cose per fare ciò che vuoi e devi scrivere molto codice solo per le informazioni di base sulla GUI. (Come un listener di eventi per ogni evento, ecc.) –

+0

Plus AWT è piuttosto obsoleto ora. – Reynolds

2

Molti hanno consigliato wxPython e io secondo il loro entusiasmo: è un ottimo framework; include anche una demo seria (con codice e applicazioni live) che sarà estremamente utile per l'apprendimento.

Ora, ATTENZIONE!

È molto semplice confondere la fine con i mezzi. Le GUI di programmazione possono essere estremamente interessanti ma non molto produttive. Nei miei primi giorni ho passato giorni e giorni a cercare di ottenere una semplice applicazione di tracciamento (reinventando la ruota); una semplice GUI per risolvere equazioni di secondo grado; una semplice interfaccia grafica per chiamare le query del database facendo clic su determinate posizioni su una mappa, ecc. Durante tutto questo tempo non ho mai effettivamente scavato in algoritmi o argomenti più generali e produttivi di informatica e ingegneria informatica. In retrospettiva, dovrei avere. Certo, ho imparato molto e non me ne rammarico totalmente, ma il mio consiglio è: preoccupati prima dell'algoritmo e della seconda interfaccia. Questo potrebbe non essere applicabile a tutti i campi (sono un ingegnere della NASA). Al giorno d'oggi lavoro con le applicazioni di crunch numerico senza alcuna GUI; Non penso che ne abbiano bisogno!

In ogni caso, volevo condividere i miei due centesimi con la programmazione della GUI - divertiti ma non esagerare.

+1

La cosa migliore delle interfacce Web è il loro design minimale (a causa dei limiti della programmazione web). Se Larry e Page avevano competenze di progettazione web più basilari quando codificarono l'interfaccia di google, sarebbe potuto essere molto peggio di quanto non risultasse. Less is more. È anche più economico. – wisty

0

Per Java, è possibile anche esaminare SWT.

Mentre non ho mai usato AWT o Swing, ho letto che SWT è il più facile dei tre da imparare.

Here è un discreto confronto tra i tre.

Problemi correlati