Как я могу получить где-то в программировании GUI? - PullRequest
12 голосов
/ 07 декабря 2009

Я студент бакалавриата. Я познакомился с базовым программированием пару лет назад в школе. До сих пор у меня есть понимание Core Java, Core Python и базовых C и C ++.

Каждый раз, когда я начинаю с некоторого программирования с использованием графического интерфейса, чтобы начать свой собственный проект, я поражаюсь огромному количеству, которое нужно сделать, API, который нужно изучить, архитектуре MVC и всему, о чем говорят программисты, обработка событий и т. д.

Училась на некоторое время. Пробовал мои руки на Qt и Gtk, не мог найти много документации. Пытался разобраться в пигмеях. Я в конечном итоге на том же месте, зная основной язык.

Tkinter на моем zenwalk Linux не работает, поэтому я никогда не смогу его запустить, хотя у меня есть книга по питону с объяснением Tkinter.

Но я остаюсь на том же месте, только с базовым пониманием языка.

Хочу начать все сначала, серьезно. Я хотел бы выбрать Python. Как мне учиться программированию в GUI?

Мне нужны некоторые интернет-ресурсы и указания, чтобы я не оказался в одном месте!

Ответы [ 11 ]

5 голосов
/ 07 декабря 2009

Поскольку звучит так, будто вы хотите программировать на Python GUI, могу ли я предложить PyGTK ?

Это, пожалуй, неплохое место для тех, кто знает Python и хотел бы начать с небольших базовых приложений с графическим интерфейсом. Иногда GTK может быть сложным, но с PyGTK есть множество примеров приложений с открытым исходным кодом, которые вы можете изучить, от простых до сложных.

Редактировать: этот учебник из LinuxJournal кажется довольно полезным.

Edit 2: Вот учебник с сайта PyGTK и другой учебник, который я случайно нашел в Google (кажется, что весь блог довольно полезен для того, что вы хотите сделать, на самом деле ). И, наконец, фрагмент из нижней части этой страницы может быть полезен, благодаря форумам Ubuntu.

2 голосов
/ 08 декабря 2009

Многие рекомендуют wxPython, и я поддерживаю их энтузиазм - это отличный фреймворк; он также включает в себя серьезную демонстрацию (с кодом и живыми приложениями), которая будет чрезвычайно полезна для обучения.

Теперь, ОСТОРОЖНО!

Очень просто спутать цель со средствами. Графический интерфейс программирования может быть чрезвычайно привлекательным, но не очень продуктивным. В первые дни я потратил дни и дни, пытаясь найти простое приложение для построения графиков (заново изобретать колесо); простой графический интерфейс для решения квадратных уравнений; простой графический интерфейс для вызова запросов к базе данных, щелкая определенные местоположения на карте и т. д. За все это время я никогда не копался в алгоритмах или более общих и продуктивных темах информатики и компьютерной инженерии. Оглядываясь назад, я должен был. Конечно, я многому научился и не жалею об этом, но мой совет стоит: сначала позаботьтесь о своем алгоритме, а потом - о своем интерфейсе. Это может не относиться к каждой области (я инженер для НАСА). В настоящее время я работаю с приложениями обработки чисел без каких-либо графических интерфейсов; Я не думаю, что они нуждаются в них!

В любом случае, я просто хотел поделиться своими двумя центами с программированием GUI - получайте удовольствие, но не переусердствуйте.

2 голосов
/ 08 декабря 2009

Я знаю, что ты чувствуешь - я изучил много компьютерного программирования во время моей степени CS, но очень мало о GUI. Я закончил тем, что учил себя какао / Objective-C для проекта Какао - это замечательно для вещей с графическим интерфейсом, но часто это королевская боль с крутой кривой обучения. Если у вас нет опыта программирования на C, не беспокойтесь.

Первый шаг: ознакомьтесь с соглашением о разработке MVC (Модель / Представление / Контроллер), потому что почти каждая инфраструктура GUI будет ссылаться на него. Google это - есть много ресурсов об этом. Мое быстрое, простое определение:

Уровень модели определяет данные или логическую модель для приложения. Для веб-приложения это будет база данных. Для игры могут храниться данные и логика / правила игры.

Уровень просмотра - это то, что пользователь видит и взаимодействует (GUI).

Уровень контроллера - это логика, которая связывает их. Например, контроллер знает, что когда вы нажимаете кнопку «начать игру» на уровне просмотра, он выполняет некоторые действия с моделью (например, настраивает игровое поле и игроков).

Шаг второй: выясните, что вы хотите. Вы заинтересованы в настольных приложениях конкретно? Игры? Веб-приложения?

Если главным образом то, что вы хотите сделать, - это иметь возможность разрабатывать что-то, что люди на самом деле использовали бы, другой вариант - это изучить среду веб-разработки. Фреймворки облегчают работу. Я лично люблю Django, и если вы знаете немного Python, немного HTML и немного о MVC, вы можете быстро его освоить. (Только не смущайтесь, потому что то, что Django называет представлением, на самом деле является контроллером.)

Если вы хотите заняться играми или графикой / анимацией, загляните в pygame. Я использовал его для учебного проекта - в основном научил его самому себе за пару недель - и он отлично работал.

Я бы сказал, держись подальше от Java Swing / awt / etc.

Я слышал хорошие вещи о wxPython - я чуть не закончил использовать его вместо Какао, потому что материал wx доступен на нескольких языках программирования и все кроссплатформенные.

Удачи! Оставайся сильным! Я знаю, что это действительно пугает, потому что я был на твоем месте. Вы можете сделать это с помощью некоторой работы, практики и мотивации.

2 голосов
/ 07 декабря 2009

Для Python GUI мне нравится wxPython ( www.wxpython.org ). Это довольно легко начать с простых элементов управления и макетов. Это также кроссплатформенный. Там много учебников. Просто найдите учебник по wxPython.

2 голосов
/ 07 декабря 2009

Если вы больше склоняетесь к играм ...

Я предлагаю вам установить Pygame и Python и пройти их учебные пособия . Выберите простой игровой или графический проект и запрограммируйте его!

1 голос
/ 08 декабря 2009

Для работы с графическим интерфейсом вообще :

Меньше значит больше

Работа с графическим интерфейсом (даже в продуктивных рамках) примерно такая же увлекательная и продуктивная, как рисование Эйфелевой башни зубной щеткой. Перейти на минимальный дизайн.

Избегайте государства, как чума

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

WxPython

Если вы хотите изучить wxPython, вот несколько ловушек, которые я заметил:

Учебник

Использовать этот урок - http://wiki.wxpython.org/AnotherTutorial

Это лучший, который я нашел.

Но не забывайте переключать номера строк для простоты вставки.

События

События немного похожи на исключения, и они используются, чтобы сделать вещи интерактивными.

В программе vanilla python вы пишете что-то вроде:

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

for i in range(10):
    doit()

print 'Results = ',result

В графическом интерфейсе вы делаете что-то вроде:

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

Каждый раз, когда пользователь нажимает клавишу, событие вызывается. Поскольку frame привязано к событию (frame.Bind(wx.EVT_KEY_DOWN, doit)), функция doit будет вызываться с событием в качестве аргумента.

Печать в stderr не слишком горячая в графическом интерфейсе, но doit также может вызвать диалог или сделать все, что вы захотите.

Также вы можете создавать свои собственные события, используя таймеры.

Приложения, рамки, окна, панели и размеры

У всего есть родитель. Если событие возникает, и потомок не пропускает его (используя event.Skip()), тогда родитель также должен будет обработать событие. Это аналогично исключениям, поднимаемым до функций более высокого уровня.

A wx.App аналогично основной функции.

wx.Window на самом деле не используется. Материал наследуется от него, и у него есть все методы для определения размера и макета, но вам не нужно это знать.

wx.Frame - это плавающая рамка, как и главное окно в Firefox. Вы будете иметь основной кадр в базовом приложении. Если вы хотите редактировать несколько файлов, то у вас может быть больше. У wx.Frame обычно не бывает родителей.

wx.Panel является частью родительского окна. Вы можете иметь несколько панелей внутри рамки. Панель может иметь wx.Frame в качестве родительского элемента или дочернего элемента другой панели.

wx.Sizers используются для автоматического размещения панелей внутри фреймов (или других панелей).

Код:

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

Я был действительно плох, и не использовал практики ООП. Просто помните, что даже если вы ненавидите ОО в большинстве случаев, программирование с помощью графического интерфейса - это то место, где ООП действительно сияет.

MCV

Я не получаю MCV. Я не думаю, что вам нужен MCV. Я думаю, что MW (модель-виджет) рамки в порядке.

Например - 2 кадра, которые редактируют один и тот же фрагмент текста:

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 имеет среду слушателя-подписчика, которая является лучшей версией модели, которую я только что набросал (она использует слабые ссылки, поэтому удаленные слушатели не торчат и т. Д.), Но это должно помочь вам получить идея.

1 голос
/ 07 декабря 2009

Что вы подразумеваете под "Графика"? Вы имеете в виду игровую графику или просто код пользовательского интерфейса (формы, веб-страницы и тому подобное)? В случае игровой графики есть предел тому, как простые вещи могут быть сделаны, но, например, http://www.gamedev.net, имеет множество вводных статей по 2d и 3d движкам. Для чего-то большего по линии приложения вы можете просто загрузить Visual Studio или Eclipse и потратить некоторое время на просмотр кода, автоматически сгенерированного их редакторами WYSIWYG.

0 голосов
/ 09 декабря 2009

Для Java вы также можете посмотреть SWT .

Хотя я никогда не использовал AWT или Swing, я прочитал, что SWT - самый простой из трех для изучения.

Здесь - достойное сравнение между тремя.

0 голосов
/ 08 декабря 2009

Одним из лучших Python GUI, из которого вы можете изучить, является источник IDLE. Он всегда поставляется с Python.

0 голосов
/ 07 декабря 2009

независимо от того, какой язык вы выберете, вам придется разобраться со многими деталями, связанными с программированием GUI. это связано с природой оконной среды, обычно используемой для графического интерфейса.

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

с C # в VS 2008 все о выборе элементов и методов из списков. очень легко начать работу и иметь рабочий проект.
затем вы можете попытаться настроить свое приложение, чтобы лучше понять, что происходит за кулисами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...