Python Tkinter StringVar()未打包在JSON请求中

Python Tkinter StringVar()未打包在JSON请求中,python,tkinter,gmail-api,Python,Tkinter,Gmail Api,我遇到了一个问题,将Tkinter StringVar()变量打包到一个函数中,然后将该变量传递给Google的Gmail API。当我用常规字符串替换StringVar变量时,我没有问题。当我从StringVar()检查变量的类型并将其转换为字符串时,它将返回string类型。我尝试过使用.format()并尝试过只传递get()函数。两者都不被接受 使用str(delegator.get()或delegator.get()我收到以下错误代码:https://www.googleapis.co

我遇到了一个问题,将Tkinter StringVar()变量打包到一个函数中,然后将该变量传递给Google的Gmail API。当我用常规字符串替换StringVar变量时,我没有问题。当我从StringVar()检查变量的类型并将其转换为字符串时,它将返回string类型。我尝试过使用.format()并尝试过只传递get()函数。两者都不被接受

使用str(delegator.get()或delegator.get()我收到以下错误代码:https://www.googleapis.com/gmail/v1/users/me/settings/delegates?alt=json 返回的“错误请求”>

用户是管理员帐户

代码如下:

   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 = 'user@domain.com'#or str(self.delegator.get()) #both return user@domain.com
            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

类委托(tk.Frame):
定义初始化(自、父、控制器):
tk.Frame.\uuuu init\uuuuu(自,父)
self.delegator=tk.StringVar()
key\u path='service\u id.json'
API_作用域=['https://www.googleapis.com/auth/gmail.settings.basic',
'https://www.googleapis.com/auth/gmail.settings.sharing']
凭据=服务\帐户。凭据。来自\服务\帐户\文件(密钥\路径,作用域=API \作用域)
button1=tk.按钮(self,width=50,text=“BACK”,
命令=lambda:controller.show_帧(起始页))
button1.网格(列=0,行=0)
请打印=tk.按钮(自身,宽度=50,text=“打印”,
command=lambda:self.main(凭证、self.delegator))
请打印网格(列=0,行=3)
delegator\u entry=tk.entry(self,width=30,textvariable=self.delegator)
delegator_entry.grid(列=0,行=2)
delegator\u label=tk.label(self,text=“请输入您想要访问的电子邮件地址。”)
delegator_label.grid(列=0,行=1)
def主(自身、凭证、委托人):
字符串user@domain.com“#或str(self.delegator.get())#都返回user@domain.com
打印(类型(字符串))#返回
credentials_delegated=凭证。带有_主题({})。格式(字符串))
gmail\u服务=build(“gmail”,“v1”,凭证=credentials\u委托)
gmail_服务.users().settings().delegates().create(userId='me',body={'delegateEmail':用户,“验证状态”:“已接受”}.execute()
断言gmail_服务

我让它工作了。保罗·科尼利厄斯说得对,我错过了订单。以下是工作代码:

    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

我让它工作了。保罗·科尼利厄斯说得对,我错过了订单。以下是工作代码:

    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

delegator.get()实际上返回了一个“常规字符串”,建议:在print语句中,不仅要打印字符串的类型,还要打印它的值(即print(type(string),string)。如果打印的值为'user@domain.com“它的类型是str,那么它的工作原理就和你硬编码字符串的值一样。你是说它不工作吗?谢谢你让我知道print命令。它实际上是空的。这说明api调用不工作。StringVar()有什么问题吗?”这不允许为其分配另一个变量?StringVar是Python变量,因此没有任何东西可以阻止您将另一个对象绑定到同一个变量名。但我看不出您在哪里这样做。StringVar是str的持有者。str由StringVar.set方法设置,并由StringVar.get方法访问。当delegator\u条目文本框更改时,tkinter也会自动设置它。您是否正在键入“user@domain.com(或其他)在单击“打印”按钮之前输入delegator_条目?否则字符串仍将有其初始值,即“”…delegator.get()实际上返回一个“常规字符串”,建议:在print语句中,不仅要打印字符串的类型,还要打印其值(即print(type(string),string)。如果打印的值为'user@domain.com“它的类型是str,那么它的工作原理就和你硬编码字符串的值一样。你是说它不工作吗?谢谢你让我知道print命令。它实际上是空的。这说明api调用不工作。StringVar()有什么问题吗?”这不允许为其分配另一个变量?StringVar是Python变量,因此没有任何东西可以阻止您将另一个对象绑定到同一个变量名。但我看不出您在哪里这样做。StringVar是str的持有者。str由StringVar.set方法设置,并由StringVar.get方法访问。当delegator\u条目文本框更改时,tkinter也会自动设置它。您是否正在键入“user@domain.com在点击“打印”按钮之前,输入delegator_条目?否则字符串仍将有其初始值,即“”。。