Add an additional git account in Mac

This article explains on how to set up an alternate remote url pointing to a different git account.

Add the username and password of your desired GitHub account

git config user.name mew_username
git config user.email new_email

git config -l

git remote set-url origin https://your_username@github.com/your_username/yourproject.git

List the configuration to display all the available accounts

git config -l
credential.helper=osxkeychain
user.name=Other Username
user.email=50510199+otherusername@users.noreply.github.com
core.autocrlf=input
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true
user.name=new_username
user.email=new_username@email.com

Add a remote url with the new username

git remote set-url origin https://new_username@github.com/new_username/projectname.git

Now its safe too push to the remote repository

git push origin master

Tkinter TreeView – Enable Sorting upon Clicking Column Headings

The below code snippet can help you achieve the Sorting Option on Treeview Column Headings in Tkinter in both ascending and descending order.

columns = ("Student","Course","Last Session")

tv = Treeview(popup, show='headings', columns=columns,height=25)

def treeview_sort_column(tv, col, reverse):
    l = [(tv.set(k, col), k) for k in tv.get_children('')]
    l.sort(reverse=reverse)

    # rearrange items in sorted positions
    for index, (val, k) in enumerate(l):
        tv.move(k, '', index)

    # reverse sort next time
    tv.heading(col, command=lambda _col=col: treeview_sort_column(tv, _col, not reverse))

for col in columns:
    tv.heading(col, text=col,command=lambda _col=col: treeview_sort_column(tv, _col, False))
tv.pack()

 

ModuleNotFoundError: No module named ‘babel.numbers’

Traceback (most recent call last):
File "tkinter/__init__.py", line 1705, in __call__
File "script.py", line 726, in
File "script.py", line 536, in calendar
File "tkcalendar/calendar_.py", line 211, in __init__
File "babel/dates.py", line 314, in get_day_names
File "babel/core.py", line 641, in days
File "babel/core.py", line 364, in _data
File "babel/localedata.py", line 111, in load
File "babel/localedata.py", line 111, in load
File "babel/localedata.py", line 117, in load
ModuleNotFoundError: No module named 'babel.numbers'

Solution Explained

Locate the tkcalendar folder under venv/lib/python3.x/site-packages of your project folder.

Under calendar.py, add an additional import for the missing module.

import calendar
from babel.dates import format_date, parse_date, get_day_names, get_month_names
from babel.numbers import *  # Additional Import

Mac OS X – ValueError: unknown locale: UTF-8

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/locale.py", line 568, in getdefaultlocale
return _parse_localename(localename)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/locale.py", line 495, in _parse_localename
raise ValueError('unknown locale: %s' % localename)
ValueError: unknown locale: UTF-8

To Solve the above issue you will need to add the below variables in your .profile or .bash_profile

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

From the Launchpad, open the Terminal

Type nano .profile
Nano is an easy to use editor

Copy the below lines of code
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

Press Ctrl+O to save the lines
Press Return to Save
Press Ctrl+X to Exit

To verify that the variables have been added to the .profile, use the below code in the terminal

open -e .profile

Try running your program once again. If the issue has not been resolved, use the same approach with the file .bash_profile

 

gspread timeout – Reconnecting to the Google API

gspread loses connection with the Google API probably every 10 minutes. This can be easily tackled by calling a function or Class which reconnects to the database.

import gspread
from oauth2client.service_account import ServiceAccountCredentials

from datetime import datetime
from datetime import timedelta

def connect_database():

scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)
client = gspread.authorize(creds)

workbook1 = client.open("File_Name")
w1 = workbook1.worksheet("Sheet1")
w2 = workbook1.worksheet("Sheet2")

return w1,w2

program_start_time=datetime.now()

if datetime.now() > program_start_time + timedelta(minutes=10):
worksheet1, worksheet2 = connect_database()
program_start_time = datetime.now() #Resets the Program Start Time

gspread – Add Formula to Google Spreadsheet Cells

gspread documentation does not have any examples of adding formulas to the cells. If you try to use them with append_row or update_cell methods it records them as a string and not as a Formula.

You should instead use the update_cell method

Updating a Single Cell, considering you know the exact Row and Column Number

worksheet2.update_acell('A45','=SUM(D45:F45)')

Updating a Single Cell, considering you the exact Row and Column Number are not known

cell = worksheet2.find("David Letterman")
row_number = cell.row
workbook2_row='A'+str(row_number)

worksheet2.update_acell(workbook2_row,'=INDIRECT(CONCATENATE("D",ROW()))-INDIRECT(CONCATENATE("E",ROW()))')

Pygsheets – Adding Data to Google Spreadsheets

I was facing a 5 second time delay adding data to Google Spreadsheets while using the gpread library. Web search revealed the same with other users as well.

Web search led me to pygsheets, a user seemed to claim that it is much faster when writing data into Google Spreadsheets, but my experience has been different.

Pygsheets takes a minimum 9 seconds to save a record compared to 5 seconds with gpread. If a coder has had a better experience, kindly do share your feedback.

There are few tutorials online for pygsheets, I am assuming the slowness of the system might be the reason.

import pygsheets
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)

client = pygsheets.authorize(service_file='client_secret.json')
workbook = client.open("Spreadsheet_File_Name")

worksheet1 = workbook.worksheet_by_title("Sheet1")

rowcount=worksheet1.rows

row_value=['a','b','c']

worksheet1.insert_rows(row=rowcount,number=1, values=row_value,inherit=True)

#worksheet1.add_rows(1)
#worksheet1.update_row(rowcount+1,values=row_value)

‘int’ object is not callable

If you get an error message like one of these:

TypeError: 'int' object is not callable
TypeError: 'float' object is not callable
TypeError: 'str' object is not callable

This probably means that you are trying to call a method when a property with the same name is already available.

Simply change the method call into a property access.

For example, if a line like this causes an error message like one of those above:

rowcount=worksheet1.rows()
Try changing the line to this:

rowcount=worksheet1.rows