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

Другая причина постараться не устанавливать объекты в NULL, когда Вы сделаны с ними, состоит в том, что это может на самом деле поддержать их для дольше.

, например,

void foo()
{
    var someType = new SomeType();
    someType.DoSomething();
    // someType is now eligible for garbage collection         

    // ... rest of method not using 'someType' ...
}

позволит объекту, отнесенному someType быть GC'd после того, как вызов к "DoSomething", но

void foo()
{
    var someType = new SomeType();
    someType.DoSomething();
    // someType is NOT eligible for garbage collection yet
    // because that variable is used at the end of the method         

    // ... rest of method not using 'someType' ...
    someType = null;
}

сможет иногда поддерживать объект до конца метода. JIT обычно будет оптимизируемый далеко присвоение на пустой указатель , таким образом, оба бита кода закончат тем, что были тем же.

12
задан skaffman 8 December 2009 в 16:17
поделиться

11 ответов

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

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

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

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

5
ответ дан 2 December 2019 в 20:41
поделиться

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

2
ответ дан 2 December 2019 в 20:41
поделиться

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

Осторожно!

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

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

2
ответ дан 2 December 2019 в 20:41
поделиться

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

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

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

0
ответ дан 2 December 2019 в 20:41
поделиться

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

0
ответ дан 2 December 2019 в 20:41
поделиться

Для Java вы также можете изучить SWT .

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

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

0
ответ дан 2 December 2019 в 20:41
поделиться

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2
ответ дан 2 December 2019 в 20:41
поделиться

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

Меньше значит лучше

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

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

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

wxPython

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

Учебник

Используйте этот учебник - http://wiki.wxpython.org/AnotherTutorial

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

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

События

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

В оригинальной программе на питоне вы пишете что-то вроде:

 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.Bind (wx.EVT_KEY_DOWN, doit) ), функция doit будет вызываться с событием в качестве аргумента. .

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

Кроме того, вы можете создавать свои собственные события с помощью таймеров.

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

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

wx.App подобен функции Main.

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

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

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

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

или это может быть дочерний элемент другой панели.

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

или это может быть дочерний элемент другой панели.

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

Код:

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

Код:

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
ответ дан 2 December 2019 в 20:41
поделиться

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

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

2
ответ дан 2 December 2019 в 20:41
поделиться

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

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

0
ответ дан 2 December 2019 в 20:41
поделиться

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

1
ответ дан 2 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: