2009-12-07 12 views
11

Soy un estudiante de pregrado. Estuve expuesto a la programación básica hace un par de años en la escuela. Hasta ahora tengo una comprensión de Core Java, Core Python y C y C++ básicos.¿Cómo puedo llegar a algún lugar en la programación de GUI?

Cada vez que empiezo con una programación de GUI para poder comenzar con un proyecto mío, me da vueltas la enorme cantidad que hay que hacer, la API que aprender, la arquitectura MVC y todo lo que los programadores hablan , manejo de eventos, etc.

Studied awt and swings por un tiempo. Probé mis manos en Qt y Gtk, no pude encontrar mucha documentación. Intenté dar sentido al pygame. Termino en el mismo lugar, conociendo el lenguaje central.

Tkinter on my zenwalk Linux se ha roto, por lo que nunca podría iniciarlo aunque tengo un libro en python con Tkinter explicado.

Pero termino en el mismo lugar, con el conocimiento básico del idioma.

¿Quieres empezar de nuevo, en serio ahora. Me gustaría elegir Python. ¿Cómo debo estudiar la programación de GUI?

Necesito algunos recursos de Internet y dirección para que no termine en el mismo lugar!

+1

programación de gráficos en Python? ¿Seriamente? –

+1

@David Lively - ¿Qué hay de malo en comenzar allí? Obviamente es un principiante en gráficos, y parece tener solo una comprensión básica de la programación (lo siento si estoy equivocado). – gahooa

+1

Con la programación de gráficos, ¿se refiere a la programación gráfica de la interfaz de usuario? ¿O te refieres a gráficos de computadora, como en videojuegos y películas animadas? –

Respuesta

5

Dado que parece que quieres programar la GUI de Python, ¿puedo sugerir PyGTK?

Probablemente sea un muy buen lugar para comenzar para alguien que conoce Python y le gustaría comenzar de a poco con algunas aplicaciones básicas de GUI. GTK puede ser complejo a veces, pero con PyGTK hay muchas aplicaciones de ejemplo de código abierto que puedes estudiar, desde simples hasta complejas.

Editar: Este tutorial from LinuxJournal parece bastante útil.

Editar 2: Aquí está the tutorial from PyGTK's site, y another tutorial I randomly found from Google (parece que todo el blog es bastante útil para lo que quieres hacer, en realidad). Finalmente, el fragmento en la parte inferior de this page podría ser útil, cortesía de los foros de Ubuntu.

+0

Gracias Reynolds. Tu publicación es útil. :) –

+0

¿Puedo tener más recursos y libros electrónicos para pygtk? –

+0

Intenté agregar algunos más para usted, avíseme si esos ayudan. – Reynolds

2

Si usted se inclina más a los juegos ...

sugiero instalar Pygame y Python, e ir a través de su tutorials. ¡Elige un juego simple o proyecto de gráficos y programalo!

1

¿Qué quiere decir con "Gráficos"? ¿Te refieres a los gráficos del juego o simplemente te refieres al código de la interfaz del usuario (formularios, páginas web, ese tipo de cosas)? En el caso de los gráficos del juego, hay un límite de cómo se pueden hacer las cosas simples, pero http://www.gamedev.net, por ejemplo, tiene toneladas de artículos introductorios en los motores 2d y 3d. Para algo más a lo largo de la línea de la aplicación, simplemente descargue Visual Studio o Eclipse y dedique un tiempo a ver el código generado automáticamente por sus editores WYSIWYG.

0

Si ya ha pasado por pygame, tk, Qt, y GTK, entonces realmente lo único que queda que puedo pensar es pyglet, lo cual admito que no lo he intentado, pero he leído uniformemente cosas buenas al respecto .

Aún así, más que nada, parece que tienes problemas para mantenerte en una estructura lo suficiente como para asimilarla.¿Puedo recomendar comenzar con un proyecto pequeño, como Pong o Breakout, y solo aprender todo lo que necesita para hacerlo? Una vez que haya terminado una cosa, tendrá una idea de la biblioteca, y continuar más allá es mucho más fácil.

0

sea cual sea el idioma que elija, tendrá que lidiar con los muchos detalles que implican la programación de GUI. esto se debe a la naturaleza del entorno basado en la ventana que generalmente se usa para GUI.

lo que puede ayudarlo a avanzar rápidamente en el desarrollo de aplicaciones basadas en GUI es menos el lenguaje y más el IDE que usa. un buen IDE puede hacer una parte de las cosas menos interesantes para que pueda enfocarse en el panorama general.

con C# en VS 2008 se trata de elegir elementos y métodos de listas de cuadros. es muy fácil comenzar y tener un proyecto en funcionamiento.
a continuación, puede tratar de personalizar la aplicación para obtener una mejor comprensión de lo que está pasando detrás de las escenas

2

para Python GUI me gusta wxPython (www.wxpython.org). Es muy fácil comenzar con controles y diseños simples. También es multiplataforma. Un montón de tutoriales por ahí. Solo busca el tutorial de wxPython.

+0

No lo he usado yo mismo, pero a menudo he escuchado cosas buenas sobre wxPython. Esta podría ser una buena solución alternativa para sus necesidades si encuentra frustrante a PyGTK, aunque no puedo darle experiencias de primera mano. – Reynolds

+0

wxPython es genial! No lo he usado por un tiempo, pero la documentación solía ser bastante incompleta. Solía ​​forzarte a volver a la documentación de wxWindows C++ API, que es un problema si no conoces C++. –

0

Una de las mejores GUI de Python que puedes estudiar es la fuente de IDLE. Siempre viene con Python.

1

Para el trabajo de interfaz gráfica de usuario en general:

Menos es más

trabajo interfaz gráfica de usuario (incluso en los marcos productivos) es lo más divertido y productivo como pintar la Torre Eiffel con un cepillo de dientes. Ve por un diseño minimalista

Evitar el Estado como la peste

pones estado en su interfaz gráfica de usuario, o en el modelo? Si lo coloca en la GUI, se equivocará con rutas de código redundantes e inconsistentes. Si lo coloca en el modelo, se arriesga a un sistema demasiado complejo que no se sincroniza cuando la GUI no se actualiza desde el modelo. Ambos apestan.

wxPython

Si quieres aprender wxPython, aquí hay algunas trampas que me di cuenta:

El tutorial

Usar este tutorial - http://wiki.wxpython.org/AnotherTutorial

¡Es el mejor que encontré.

Pero recuerde alternar los números de línea para pegar fácilmente.

Eventos

Los eventos son un poco como excepciones, y se utilizan para hacer las cosas interactiva.

En un programa de vainilla pitón, se escribe algo como:

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

for i in range(10): 
    doit() 

print 'Results = ',result 

En una interfaz gráfica de usuario, haces algo como:

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() 

Cada vez que el usuario pulsa una tecla, un evento ser criado. Como frame está vinculado al evento (frame.Bind(wx.EVT_KEY_DOWN, doit)), se llamará a la función doit con el evento como argumento.

Imprimir en stderr no está demasiado caliente en una interfaz gráfica de usuario, pero también podría abrir un cuadro de diálogo o hacer lo que usted desee.

Además, puede generar sus propios eventos utilizando temporizadores.

Aplicaciones, marcos, las ventanas, paneles y Sizers

Todo tiene un padre. Si se produce un evento y el niño no lo omite (usando event.Skip()), el padre también tendrá que manejar el evento. Esto es análogo a excepciones que aumentan a funciones de nivel superior.

A wx.App es como la función Principal.

wx.Window no se utiliza realmente. Las cosas heredan de él, y tiene todos los métodos para el tamaño y el diseño, pero no es necesario que lo sepa.

wx.Frame es un marco flotante, como la ventana principal en Firefox. Tendrás un cuadro principal en una aplicación básica. Si desea editar varios archivos, es posible que tenga más. Un wx.Frame generalmente no tendrá padres.

wx.Panel es parte de una ventana primaria. Puedes tener varios paneles dentro de un marco. Un panel puede tener un wx.Frame como padre, o puede ser hijo de otro panel.

wx.Sizers se utilizan para diseñar automáticamente paneles dentro de marcos (u otros paneles).

Código:

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() 

he estado muy mal, y no se utilicen prácticas de programación orientada a objetos. Solo recuerde que incluso si odia OO en la mayoría de los contextos, la programación de GUI es el lugar donde realmente brilla la OOP.

El MCV

no consigo MCV. No creo que necesites un MCV. Creo que un marco de MW (modelo-widget) está bien.

Por ejemplo - 2 cuadros que editan el mismo fragmento de texto:

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 tiene un marco oyente abonado, que es una versión mejor del modelo acabo esbozado (Utiliza referencias débiles, los oyentes eliminados no se quedan, etc.), pero eso debería ayudarlo a entender la idea.

+1

¿No debería ser MVC, no MCV? – Joel

1

Sé cómo se siente: aprendí mucha programación de computación durante mi CS degree pero muy poco sobre GUIs. Terminé enseñándome Cocoa/Objective-C para un proyecto. Cocoa es maravilloso para cosas de interfaz gráfica de usuario, pero a menudo un dolor real con una curva de aprendizaje empinada. Si no tiene experiencia con la programación C, no se moleste.

Primer paso: familiarícese con la convención de diseño MVC (Modelo/Vista/Controlador), ya que casi todos los marcos de la GUI harán referencia a ella. Google it - hay muchos recursos al respecto. Mi definición rápida y simple es:

El nivel del modelo define los datos o el modelo lógico para la aplicación. Para una aplicación web, esa sería la base de datos. Para un juego, podría ser datos almacenados y lógica/reglas del juego.

El nivel de vista es lo que el usuario ve e interactúa con (la GUI).

El nivel del controlador es la lógica que conecta los dos. Por ejemplo, el controlador sabe que cuando hace clic en el botón "iniciar juego" en el nivel de vista, hace algunas cosas con el modelo (por ejemplo, configurar el tablero y los jugadores).

Paso dos: ver qué usted quiere. ¿Le interesan específicamente las aplicaciones de escritorio? ¿Juegos? Aplicaciones web?

Si lo que desea hacer en su mayoría es poder desarrollar algo que la gente realmente usaría, otra opción es aprender un marco de desarrollo web. Los marcos hacen las cosas fáciles para ti. Me encanta Django, personalmente, y si conoces un poco de Python y un poco de HTML y un poco sobre MVC, puedes recogerlo rápidamente. (No se confunda, porque lo que Django llama una vista es en realidad un controlador.)

Si lo que desea hacer es juegos o gráficos/animación, consulte pygame. Lo usé para un proyecto de clase, básicamente me lo enseñé en un par de semanas, y funcionó muy bien.

Yo diría que te quedes lo más lejos que puedas de Java Swing/awt/etc.

He escuchado cosas buenas sobre wxPython: casi termino usándolo en lugar de Cocoa, porque las cosas wx están disponibles en varios lenguajes de programación y todo es multiplataforma.

¡Buena suerte! ¡Mantenerte fuerte! Sé que es realmente intimidante, porque he estado en tus zapatos. Puedes hacerlo con un poco de trabajo, práctica y motivación.

+0

¿Por qué mantenerse alejado de Java Swing/awt/etc? –

+0

En mi experiencia, desarrollar aplicaciones de GUI en Java es un gran dolor. Es difícil crear una interfaz realmente atractiva, es difícil hacer que las cosas funcionen como se desea y hay que escribir MUCHO código solo para las funciones básicas de la GUI. (Como un detector de eventos para cada evento, etc.) –

+0

Plus AWT ya no está actualizado. – Reynolds

2

Muchos han recomendado wxPython, y en segundo lugar su entusiasmo: es un gran marco; también incluye una demostración seria (con código y aplicaciones en vivo) que será extremadamente valiosa para el aprendizaje.

¡Ahora, TEN CUIDADO!

Es muy simple confundir el final con los medios. Las GUI de programación pueden ser extremadamente atractivas pero poco productivas. En mis primeros días pasé días y días tratando de obtener una aplicación de trazado simple (reinventando la rueda); una GUI simple para resolver ecuaciones cuadráticas; una GUI simple para llamar consultas de bases de datos haciendo clic en ciertas ubicaciones en un mapa, etc. Durante todo este tiempo, nunca profundicé en algoritmos ni en temas más generales y productivos de informática e ingeniería informática. En retrospectiva, debería haberlo hecho. Por supuesto, aprendí mucho y no me arrepiento totalmente, pero mi consejo es: primero preocúpese por su algoritmo y luego por su interfaz. Esto puede no aplicarse a todos los campos (soy ingeniero de la NASA). Actualmente, trabajo con aplicaciones de procesamiento de números sin GUI; ¡No creo que los necesiten!

De todos modos, solo quería compartir mis dos centavos con la programación de GUI: diviértase, pero no exagere.

+1

Lo mejor de las interfaces web es que su diseño minimalista (debido a las limitaciones de la programación web). Si Larry y Page tenían más que habilidades básicas de diseño web cuando codificaron la interfaz de Google, podría haber sido mucho peor de lo que resultó ser. Menos es más. También es más barato. – wisty

0

Para Java, también puede consultar SWT.

Si bien nunca he usado AWT o Swing, he leído que SWT es el más fácil de los tres para aprender.

Here es una comparación decente entre los tres.

Cuestiones relacionadas