Search code examples
pythontkintergmail-api

Python Tkinter StringVar() not being packaged in a JSON request


I'm having an issue with packaging a Tkinter StringVar() variable into a function that then takes the variable and passes it to Google's Gmail API. When I replace the StringVar variable with regular strings, I don't have an issue. When I check the type of the variable from StringVar() and I convert it to a string, it returns types string. I've tried using .format() and I've tried just passing the get() function. Neither is accepted.

Using str(delegator.get()) or delegator.get() I receive this error code: https://www.googleapis.com/gmail/v1/users/me/settings/delegates?alt=json returned "Bad Request">

USER is the admin account.

Here's the code:

   class Delegation(tk.Frame):

        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
            self.delegator = tk.StringVar()

            key_path = 'service_id.json'
            API_scopes =['https://www.googleapis.com/auth/gmail.settings.basic',
                         'https://www.googleapis.com/auth/gmail.settings.sharing']
            credentials = service_account.Credentials.from_service_account_file(key_path,scopes=API_scopes)

            button1 = tk.Button(self,width=50, text="BACK",
                                command=lambda: controller.show_frame(StartPage))
            button1.grid(column=0,row=0)

            pls_print = tk.Button(self,width=50, text="print",
                                command=lambda: self.main(credentials,self.delegator))
            pls_print.grid(column=0,row=3)

            delegator_entry = tk.Entry(self, width=30, textvariable=self.delegator)
            delegator_entry.grid(column=0, row=2)

            delegator_label = tk.Label(self, text="Please enter email address \nyou want to access.")
            delegator_label.grid(column=0, row=1)

        def main(self,credentials,delegator):
            string = '[email protected]'#or str(self.delegator.get()) #both return [email protected]
            print(type(string)) # returns <class 'str'>

            credentials_delegated = credentials.with_subject('{}'.format(string)) 

            gmail_service = build("gmail","v1",credentials=credentials_delegated)

            gmail_service.users().settings().delegates().create(userId='me', body={'delegateEmail': USER, "verificationStatus": "accepted"}).execute()
            assert gmail_service


Solution

  • I got it working. Paul Cornelius was right about me missing up the order. Here's the working code:

        class Delegation(tk.Frame):
    
            def __init__(self, parent, controller):
                tk.Frame.__init__(self, parent)
                delegator_entry = tk.StringVar()
    
                key_path = 'service_id.json'
                API_scopes =['https://www.googleapis.com/auth/gmail.settings.basic',
                                 'https://www.googleapis.com/auth/gmail.settings.sharing']
                credentials = service_account.Credentials.from_service_account_file(key_path,scopes=API_scopes)
    
                button1 = tk.Button(self,width=50, text="BACK",
                                    command=lambda: controller.show_frame(StartPage))
                button1.grid(column=0,row=0)
    
                delegator_label = tk.Label(self, textvariable=delegator_entry)
                delegator_label.grid(column=0, row=1)
    
                delegator_entry = tk.Entry(self, width=30, textvariable=delegator_entry)
                delegator_entry.grid(column=0, row=2)
    
                pls_print = tk.Button(self,width=50, text="print",
                                command=lambda: self.let_me_set(credentials,delegator_entry))
                pls_print.grid(column=0,row=3)
    
    
            def let_me_set(self, credentials, delegator_entry):
                global delg
                delg = delegator_entry.get()
                self.main(credentials,delg)
    
            def main(self,credentials,delg):
                my_creds = str(delg)
                credentials_delegated = credentials.with_subject(my_creds) #this is the address that the delegation happens to.
                gmail_service = build("gmail","v1",credentials=credentials_delegated)
                gmail_service.users().settings().delegates().create(userId='me', body={'delegateEmail': USER, "verificationStatus": "accepted"}).execute()
                assert gmail_service