BG Development


Страници: (2) [1] 2   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Python MVC, desktop application
ELMAX
Публикувано на: 17-11-2017, 11:08
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 2
Регистриран на: 17.11.17



Здравейте готини хора.
Имам няколко въпроси които ме мъчат от доста време. Уча се да програмирам на Python.

Искам да напиша складова програма от рода на Микроинвест, Генсофт или Мистрал. Разбира се не толкова сложна като горните, но да се запазват данните в SQL сървър като Firebird, MySql или подобни. Да може няколко клиента да работят с една DB. Да е с MVC дизайн. За да не откривам отново топлата вода, моля да ме посъветвате какви пакети и технологии да ползвам. Доста време търся в мрежата нещо подобно, но не откривам нищо.

Например.
В модела да ползвам ли ORM (SQLAlchemy или подобни) или директно да се обръщам към базата. Графичната част с PyQT5 или Tkinter.

Изчетoх много теория за MVC но ми е трудно сам да започна от нулата. Как се пише в момента MVC десктоп приложение с достъп до DB?

Бихте ли ми подсказали къде мога да намеря нещо подобно което наистина работи реално. Не е за курсова или дипломна работа. Трябва ми за да се науча да програмирам. Моля за съвет.
PMEmail Poster
Top
bvbfan
Публикувано на: 17-11-2017, 11:39
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2493
Регистриран на: 08.12.13





--------------------
QUOTE (Bender @ 23-04-2015, 19:11)
Xamarin: ЛАПАЙ!
Ти: Добре...
PMEmail Poster
Top
ici
Публикувано на: 17-11-2017, 13:24
Quote Post


Group Icon
Име: Ивайло Илчев ики
Група: VIP
Ранг: Почетен член

Мнения: 14954
Регистриран на: 06.06.04



Qt, model based widget - grid, list, box. Модела може да куери към база данни или каквото и да е друго през къстъм клас от QAbstractItemModel:
CODE

       return

   def rowCount(self, parent):
       return len(self.data_bits)

   def columnCount(self, parent):
       return len(self.data_bits[0])

   def data(self, index, role):
       if not index.isValid():
           return None

       elif role == QtCore.Qt.CheckStateRole:
           if self.data_bits[index.row(), index.column(), 0] == b'1':
               return QtCore.Qt.Checked
           else:
               return QtCore.Qt.Unchecked

       elif role == QtCore.Qt.BackgroundColorRole:
           if self.data_bits[index.row(), index.column(), 2] == b'R': # R/O bits
               return QtGui.QColor(0xee,0xee,0x33)
           if self.data_bits[index.row(), index.column(), 0] == b'1':
               return QtGui.QColor(0x99,0xee,0x99)
           else:
               return QtGui.QColor(0xdd,0xdd,0xdd)

       elif role == QtCore.Qt.EditRole or role == QtCore.Qt.DisplayRole:
           return self.data_bits[index.row(), index.column(), 0]

       elif role == QtCore.Qt.ToolTipRole:
           tooltip = self.data_tips[index.row(), index.column()]
           if len(tooltip):
               return tooltip
           else:
               return "%d %d " % (index.row(), index.column())

       return None

   # bool QAbstractItemModel::setData(
   #    const QModelIndex & index, const QVariant & value,
   #    int role = Qt::EditRole ) [virtual]
   def setData(self, index, value, role = QtCore.Qt.EditRole ):
       if role == QtCore.Qt.EditRole:
           self.data_bits[index.row(), index.column(), 0] = value.toString()[0]
           return True
       if role == QtCore.Qt.CheckStateRole:
           if value == QtCore.Qt.Checked:
               self.data_bits[index.row(), index.column(), 0] = b'1'
           else:
               self.data_bits[index.row(), index.column(), 0] = b'0'
           return True
       else:
           print(role)
           print(index.column(), index.row())
           print(value)
           return False


Това мнение е било редактирано от ici на 17-11-2017, 13:25


--------------------
Everything you can imagine is real. Pablo Picasso
PMEmail PosterUsers Website
Top
FidelDahan
Публикувано на: 17-11-2017, 23:16
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2237
Регистриран на: 12.06.08



https://www.djangoproject.com/ ако те устройва web GUI вместо desktop application.

Ако държиш да е десктоп приложение, тогава бих помислил върху 3 слойна архитектура където имаш междинен сървър между клиента и базата данни.

Но всъщтност, щом тепърва започваш да програмираш, може би най-добре ще е да си поставиш постижими цели и да го направиш първо да върви само за един потребител, ако ще и да бъде с примитивен конзолен интерфейс и в текстов файл да съхранява данните.

Още идеи има тук
https://opensource.com/resources/python/gui-frameworks
http://docs.python-guide.org/en/latest/scenarios/gui/
PMEmail Poster
Top
ELMAX
Публикувано на: 20-11-2017, 10:45
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 2
Регистриран на: 17.11.17



QUOTE (FidelDahan @ 17-11-2017, 23:16)

тогава бих помислил върху 3 слойна архитектура където имаш междинен сървър между клиента и базата данни.

Бихте ли ми дали някакъв жокер. Къде мога да го видя това как става.
Благодаря.

Това мнение е било редактирано от ELMAX на 20-11-2017, 10:46
PMEmail Poster
Top
ProXy
Публикувано на: 20-11-2017, 11:15
Quote Post



Име: Йордан Иванов
Група: Потребител
Ранг: Почетен член

Мнения: 1529
Регистриран на: 25.01.10



Ще се опитам да го обясня:
Първи слой: База данни.
Втори слой: Web API. Може да си билднеш нещо къстъм, или да се базираш на някой "стандарт". GraphQL в момента е доста популярна технология за създаване на API.
Трети слой: Товето приложение, което прави заявки към API-то.


--------------------
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.

https://ivanovyordan.com/
PMEmail PosterUsers Website
Top
dedal
Публикувано на: 20-12-2017, 13:59
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Посетител

Мнения: 59
Регистриран на: 17.11.10



QUOTE (ELMAX @ 17-11-2017, 11:08)
Здравейте готини хора.
Имам няколко въпроси които ме мъчат от доста време. Уча се да програмирам на Python.

Искам да напиша складова програма от рода на Микроинвест, Генсофт или Мистрал. Разбира се не толкова сложна като горните, но да се запазват данните в SQL сървър като Firebird, MySql или подобни. Да може няколко клиента да работят с една DB. Да е с MVC дизайн. За да не откривам отново топлата вода, моля да ме посъветвате какви пакети и технологии да ползвам. Доста време търся в мрежата нещо подобно, но не откривам нищо.

Например.
В модела да ползвам ли ORM (SQLAlchemy или подобни) или директно да се обръщам към базата. Графичната част с PyQT5 или Tkinter.

Изчетoх много теория за MVC но ми е трудно сам да започна от нулата. Как се пише в момента MVC десктоп приложение с достъп до DB?
 
Бихте ли ми подсказали къде мога да намеря нещо подобно което наистина работи реално. Не е за курсова или дипломна работа. Трябва ми за да се науча да програмирам. Моля за съвет.

Погледни тук.
Е аз не ползвам точно по този начин но логиката е подобно.
Модела е sqlalchemy контролера връща object
Листа адва инфо от object, и се явява View

При селекция от листа на row 5 взимам от дикт кви 5 и получавам object
Контролера записва промените.
https://wiki.wxpython.org/ModelViewController

Примерно логвам се и отивам на промяна на каса на логнатия усер

self.user = DBCtrl.get_one_where(username=self.all_user[self.choice.GetSelecrion()].username, passwd=self.text.GetValue())
Тук става и с if
if self.all_user[self.choice.GetSelection()].passwd == self.text.GetValue():
self.login()
else:
pass

if self.user != None:
self.panem=MainPanel(self)
self.panel.Show()
После правя продажба в друг панел и става.
self.paren.GetParent().user.mony += 100
DBCtrl.add_obj_in_session(self.parent.user)
DBCtrl.commit()

Права за достъп в mainpanel:
if self.parent.user.group.right != 'admin':
self.b_add_user.Hide()

а при логоут:
self.parent.user= None
self.Destroy()
Не претендирам дали е мн. правилно но работи прилично.
На ревизия ще се реже доста код icon_smile.gif


П.С.
Преди да ме изкритукували за
DBCtrl.add_obj_in_session(self.parent.user) защо не е в контролера а във view
За скорост е така

Застава продавачката и цъка с четеца.
self.sell_n=[]

while True:
try:
code = rfid.read_id()
except TimeOutError:
pass
else:
EventPost(windows, code=code)

Тука хващаме евънта
art=DBCtrl.get_one_where(barcode=event.code)
art.in_wharehouse -= 1
self.sell_n.append(art.id)
DBCtrl.add_obj_in_session(art)
self.list_refresh()

И като натиснеш приключи сметка:
sell =DBCtrm.make_obj(models.Sell)
sell.art = json.dumps(self.sell_n)
DBCtrl.add_obj_in_session(sell)
self.parent.GetParent().user.mony += total
DBCtrl.add_obj_in_session(self.parent.GetParent().user)
DBCtrl.commit() #или влиза всичко или нощо

Това мнение е било редактирано от dedal на 20-12-2017, 15:13
PMEmail Poster
Top
dedal
Публикувано на: 20-12-2017, 14:26
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Посетител

Мнения: 59
Регистриран на: 17.11.10



QUOTE (ProXy @ 20-11-2017, 11:15)
Ще се опитам да го обясня:
Първи слой: База данни.
Втори слой: Web API. Може да си билднеш нещо къстъм, или да се базираш на някой "стандарт". GraphQL в момента е доста популярна технология за създаване на API.
Трети слой: Товето приложение, което прави заявки към API-то.

За 3 слой не е необходим.
Мистрал, Микроинвест, Детелина, Ънреалсофт и д-р. нямат 3 слоя. Това е за web
При този тип програми базата е затворена или в локалхост или в лошия случай в локалнет

Узера е хардкорнат в gui
Обаче продавачката в метро не може да си отиде с все каса нали?
А Мистрал и Микроинвест даже си дават и паролите за базата. А който си я е купил да си я прави каквото иска ( даже и да я изтрие не е проблем на софтуера, а на магазина)

Това мнение е било редактирано от dedal на 20-12-2017, 14:28
PMEmail Poster
Top
dedal
Публикувано на: 20-12-2017, 14:44
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Посетител

Мнения: 59
Регистриран на: 17.11.10



QUOTE (FidelDahan @ 17-11-2017, 23:16)
https://www.djangoproject.com/ ако те устройва web GUI вместо desktop application.

Ако държиш да е десктоп приложение, тогава бих помислил върху 3 слойна архитектура където имаш междинен сървър между клиента и базата данни.

Но всъщтност, щом тепърва започваш да програмираш, може би най-добре ще е да си поставиш постижими цели и да го направиш първо да върви само за един потребител, ако ще и да бъде с примитивен конзолен интерфейс и в текстов файл да съхранява данните.

Още идеи има тук
https://opensource.com/resources/python/gui-frameworks
http://docs.python-guide.org/en/latest/scenarios/gui/

А генсофт специално базата е локалнет затворена. Споделянето на инфо става с дъмп който пращаш на шефа icon_smile.gif 3 слой просто няма в тези програми. С уточнение при gui версиите (някой направиха web където си плащаш месечен абонамент)

Това мнение е било редактирано от dedal на 20-12-2017, 14:45
PMEmail Poster
Top
thrawn
Публикувано на: 20-12-2017, 14:46
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1164
Регистриран на: 17.01.17



В голяма грешка си - базата данни обикновено е отделна услуга (информационен слой ). След това имаш слой който подава и чете данни от информационния слой (контролер) и презентационен слой (частта която взаимодейства с потребителя).

Не знам защо масово решавате, че MVC е за web приложения и изобщо, защо си мислите, че това е архитектура която се прилага единствено на ниво приложение. То знам де, щото го свързвате с готов фреймуорк с пляснато MVC я в името, я в описанието.
PMEmail Poster
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (2) [1] 2  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2015 | BG Development | All Rights Reserved
RSS 2.0