doza_and
Это будет не ваша головная боль а юристов которые должны будут это все оформлять.
К сожалению моя, ибо софт пишу для своей будущей организации.
у меня тут новая проблема с wx назрела, решился все-таки сразу на нем пилить, не намного он сложнее Qt, выкладываю весь код gui, а прорблемное место в нем обозначено соответствующим коментарием (СТРАННЫЕ ДЕЛА ТВОРЯТСЯ ЗДЕСЬ).
 #-*- coding:utf-8 -*-
import wx
import wx.grid
from wx.lib import wordwrap
import locale
locale.setlocale(locale.LC_ALL,'ru')# locale.locale_alias['ru'])
class CutomGridCellAutoWrapStringRenderer(wx.grid.GridCellRenderer):   
    def __init__(self): 
        """класс костыль для автоматического расширения ячеек при многострочном заполнении"""
        wx.grid.GridCellRenderer.__init__(self)
    def Draw(self, grid, attr, dc, rect, row, col, isSelected):
        text = grid.GetCellValue(row, col)
        dc.SetFont( attr.GetFont() ) 
        text = wordwrap.wordwrap(text, grid.GetColSize(col), dc, breakLongWords = False)
        # начало моего костыля
        numlines = text.count('\n') + 1
        defrowsize = grid.GetDefaultRowSize()
        currowsize = grid.GetRowSize(row)
        needrowsize = currowsize // defrowsize 
        if numlines > needrowsize:
            newrowsize = numlines * defrowsize
            grid.SetRowSize(row, newrowsize)
        # конец моего костыля
        hAlign, vAlign = attr.GetAlignment()       
        if isSelected: 
            bg = grid.GetSelectionBackground() 
            fg = grid.GetSelectionForeground() 
        else: 
            bg = attr.GetBackgroundColour()
            fg = attr.GetTextColour() 
        dc.SetTextBackground(bg) 
        dc.SetTextForeground(fg)
        dc.SetBrush(wx.Brush(bg, wx.SOLID))
        dc.SetPen(wx.TRANSPARENT_PEN)
        dc.DrawRectangle(rect)            
        grid.DrawTextRectangle(dc, text, rect, hAlign, vAlign)
    def GetBestSize(self, grid, attr, dc, row, col): 
        text = grid.GetCellValue(row, col)
        dc.SetFont(attr.GetFont())
        text = wordwrap.wordwrap(text, grid.GetColSize(col), dc, breakLongWords = False)
        w, h, lineHeight = dc.GetMultiLineTextExtent(text)                   
        return wx.Size(w, h)        
    def Clone(self): 
        return CutomGridCellAutoWrapStringRenderer()
class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        """This class provides graphical interface declaration and base signal processing"""
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        # start calc window sizes and apply its
        dis_width, dis_height = wx.DisplaySize()
        dis_width = dis_width - (dis_width // 10)
        dis_height = dis_height - (dis_height // 10)
        self.SetMinClientSize((dis_width, dis_height))
        self.SetPosition((0,0))
        self.Maximize(maximize=True)
        # end  calc window sizes and apply its
        self.button_4 = wx.Button(self, wx.ID_ANY, "button_4")
        self.button_5 = wx.Button(self, wx.ID_ANY, "button_5")
        self.grid_3 = wx.grid.Grid(self, wx.ID_ANY, size=(1, 1))
        self.grid_4 = wx.grid.Grid(self, wx.ID_ANY, size=(1, 1))
        self.__set_properties()
        self.__do_layout()
        
    def __set_properties(self):
        """configure widgets here"""
        self.SetTitle("My service desk")
        self.grid_3.CreateGrid(200,1)
        self.grid_3.SetMaxSize((400,-1))
        self.grid_3.SetColSize(0, 330)
        self.grid_3.SetRowLabelSize(50)
        self.grid_3.SetCornerLabelValue("№")
        self.grid_3.SetColLabelValue(0, "Список заявок")
        self.grid_3.SetDefaultRenderer(CutomGridCellAutoWrapStringRenderer())
        self.grid_3.SetCellValue(0, 0, 'rfb zdfnb dzxngb zdfnb zdfnb zdfnnb zdxfnb zdfnb zdfnb zdnb zdfnb \n\n\nszdfrn zdxfngb zdfxn zxfn sdzfnh dzrsfnh zdfxn sdfxng sdgtn sdfn sdxfn ')
        self.grid_4.CreateGrid(200,50)
        self.grid_4.SetDefaultRenderer(CutomGridCellAutoWrapStringRenderer())
        self.grid_4.SetSelectionMode(self.grid_4.SelectRows)
        self.__create_table_colors()
        ########################      СТРАННЫЕ ДЕЛА ТВОРЯТСЯ ЗДЕСЬ ##############################################################
        #"""
        ''' вариант 1
        '''
        self._tables_apply_default_colors()
        self.grid_4.SetRowAttr(3, self.work_done_green_row)
        self.grid_4.SetRowAttr(3, self.gray_row)
        #"""
        
        """
        ''' вариант 2
        '''
        self._tables_apply_default_colors()
        self.grid_4.SetRowAttr(3, self.work_done_green_row)
        #self.grid_4.SetRowAttr(3, self.gray_row)
        #"""
        
        """
        ''' вариант 3
        '''
        self._tables_apply_default_colors()
        #self.grid_4.SetRowAttr(3, self.work_done_green_row)
        #self.grid_4.SetRowAttr(3, self.gray_row)
        #"""
        
        """
        ''' вариант 4
        '''
        #self._tables_apply_default_colors()
        self.grid_4.SetRowAttr(3, self.work_done_green_row)
        self.grid_4.SetRowAttr(3, self.gray_row)
        #"""
        self.__connect_slots_at_startup()
        
        
    def _tables_apply_default_colors(self):
        """in this method i apply default table colors"""
        self.grid_3.SetGridLineColour("#cccccc")
        self.grid_4.SetGridLineColour("#cccccc")
        for x in range(self.grid_3.GetNumberRows()):
            if (x+1) % 2 != 0: self.grid_3.SetRowAttr(x, self.white_row)
            else: self.grid_3.SetRowAttr(x, self.gray_row)
        for x in range(self.grid_4.GetNumberRows()):
            if (x+1) % 2 != 0: self.grid_4.SetRowAttr(x, self.white_row)
            else: self.grid_4.SetRowAttr(x, self.gray_row)
        
        
    
    def __create_table_colors(self):
        """this method create colors for rows"""
        self.white_row = wx.grid.GridCellAttr()
        self.white_row.SetBackgroundColour("#ffffff")
        self.gray_row = wx.grid.GridCellAttr()
        self.gray_row.SetBackgroundColour("#f3f3f3")
        self.work_done_green_row = wx.grid.GridCellAttr()
        self.work_done_green_row.SetBackgroundColour("#98FB98")
        
        
    def __do_layout(self):
        """"""
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_2.Add(self.button_4, 0, 0, 0)
        sizer_2.Add(self.button_5, 0, 0, 0)
        sizer_1.Add(sizer_2, 0, wx.EXPAND, 0)
        sizer_3.Add(self.grid_3, 1, wx.EXPAND, 0)
        sizer_3.Add(self.grid_4, 1, wx.EXPAND, 0)
        sizer_1.Add(sizer_3, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        self.Layout()
    
    def __connect_slots_at_startup(self):
        self.grid_3.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self._slot_grid3_cell_clicked)
        
    ############################################################### SLOTS ##################################################################
    def _slot_grid3_cell_clicked(self, evt):
        """здесь получаем имя заявки и передаем ее на подгрузку деталей в таблицу"""
        clicked_row = evt.GetRow()
        proposal_name = self.grid_3.GetCellValue(clicked_row, 0)
        self.grid_3.SelectRow(clicked_row, addToSelected=False)
        
class MyApp(wx.App):
    def OnInit(self):
        self.frame = MyFrame(None, wx.ID_ANY, "")
        self.SetTopWindow(self.frame)
        self.frame.Show()
        return True
# end of class MyApp
if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()
вариант 1 выдает такую ошибку:
17:40:01: ������: Unable to set default locale: 'unsupported locale setting'
Traceback (most recent call last):
  File "C:\Users\dev\Documents\Python Code\sdesk\guilibs.py", line 173, in OnInit
    self.frame = MyFrame(None, wx.ID_ANY, "")
  File "C:\Users\dev\Documents\Python Code\sdesk\guilibs.py", line 67, in __init__
    self.__set_properties()
  File "C:\Users\dev\Documents\Python Code\sdesk\guilibs.py", line 91, in __set_properties
    self.grid_4.SetRowAttr(3, self.gray_row)
RuntimeError: wrapped C/C++ object of type GridCellAttr has been deleted
OnInit returned false, exiting...
Error in atexit._run_exitfuncs:
wx._core.wxAssertionError: C++ assertion "m_count > 0" failed at ..\..\src\common\object.cpp(336) in wxRefCounter::DecRef(): invalid ref data count
вариант 2 другую (картинка кликабельна):

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