Как я могу попасть где-нибудь в GUI-программирование?

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

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

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

Tkinter на моем zenwalk Linux сломался, поэтому он никогда не может начать его. У меня есть книга на python с объяснением Tkinter.

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

Меньше

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

Избегайте состояния, подобного чуме

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

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

Ответ 7

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

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

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

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

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

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

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

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

Я бы сказал, оставайтесь как можно дальше от Java Swing/awt/etc.

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

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

Ответ 8

Если вы уже прошли через pygame, tk, Qt и GTK, тогда действительно единственное, что я могу представить, это pyglet, который, я признаю, я не пробовал, но я читал равномерно хорошие вещи об этом.

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

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

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

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

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