【问题标题】:int() argument must be a string, a bytes-like object or a number, not 'tuple'int() 参数必须是字符串、类似字节的对象或数字,而不是“元组”
【发布时间】:2019-04-07 19:19:42
【问题描述】:

所以我在本节中的代码应该是从 sql 数据库中获取一个值并将 tkinter 值添加到它上面,然后将该值放回 sql 数据库中

    with sqlite3.connect('aircraft.db') as db:
        c = db.cursor()
        self.flightcount4 = self.flightcount5.get()
        self.flightcount3 = int(self.flightcount4)

        c.execute("SELECT flightcount FROM aircraft WHERE Arrive = ?",(self.travelselect.get(),))
        self.total3 = c.fetchone()
        total2 = int(self.total3)
        self.total = total2 + self.flightcount3
        c.execute('UPDATE aircraft SET flightcount = :flightcount WHERE Arrive = :Arrive',{'flightcount':self.flightcount3, 'aircraftpilot':self.pilotname5 })
        db.commit()
        ms.showinfo('Success!', 'its saved!')

这是我的代码。

 Exception in Tkinter callback
 Traceback (most recent call last):
 File "C:\Users\adam\AppData\Local\Programs\Python\Python36- 
 32\lib\tkinter\__init__.py", line 1702, in __call__
 return self.func(*args)
 File "C:\A LEVELS\Computing\atom\actual results\working\Customer.py", 
 line 40, in addtocount
 total2 = int(self.total3)
 TypeError: int() argument must be a string, a bytes-like object or a 
 number, not 'tuple'
 [Finished in 30.761s]

这是错误。

从那时起,我在你的帮助下想出了这个:

 def addtocount(self):

    with sqlite3.connect('aircraft.db') as db:
        c = db.cursor()
        self.flightcount4 = self.flightcount5.get()
        self.flightcount3 = int(self.flightcount4)

        c.execute("SELECT flightcount FROM aircraft WHERE Arrive = ?",(self.travelselect.get(),))
        self.total3 = c.fetchone()[0]
        print(self.total3)
        if self.total3 == "None":
            self.total2 == int("0")
            print(self.total2)
        else:
            self.total2 = self.total3
        self.total = self.total2 + self.flightcount3
        c.execute('UPDATE aircraft SET flightcount = :flightcount WHERE Arrive = :Arrive',{'flightcount':self.flightcount3, 'aircraftpilot':self.pilotname5 })
        db.commit()
        ms.showinfo('Success!', 'its saved!')

但现在的错误是:

  File "C:\A LEVELS\Computing\atom\actual results\working\Customer.py", line 46, in addtocount
self.total = self.total2 + self.flightcount3
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
[Finished in 15.573s]

提前致谢

【问题讨论】:

    标签: python sql string tkinter


    【解决方案1】:

    据我所知c.fetchone() 获取整行。即使您只在 SQL 语句中指定一个值,它也会被包装在一个元组中。如果您尝试打印它,它的语法会看起来像这样:

    ('flightcount value')
    

    请注意值周围的那些讨厌的括号。

    您收到错误的原因是因为int(self.total3) 尝试解析来自c.fetchone() 的整个元组(行)。相反,您需要从行中选择特定列,如下所示:

    int(self.total3[0])
    

    【讨论】:

    • 我尝试过这样做,但出现了同样的错误,我也尝试了不同的方法,因为我在 sql 数据库中有 9 列我尝试过 [8] 和 [9] 并且都说index 你知道为什么吗?谢谢
    • @AdamWilson 是不是和以前一样完全的错误?尝试通过在self.total3 = c.fetchone()print(self.total3[0]) 之后添加print(self.total3) 来查看self.total3 中的实际值是什么,以确保其中确实存在一个值。
    • 另外请注意,您只需要关心您在SELECT-clause 中指定的列名的索引。如果你的 select 子句看起来像 SELECT flightcount, Arrive FROM ...,那么 flightcount 在索引 0 上,Arrive 在索引 1 上,无论它们在实际数据库中是如何组织的。
    • self.total3[0] 的打印为“none”
    • 如果您查看上面的代码,我已经添加了一些内容,因为我无法将代码放在上面。这是我相信我应该走的方向,但它仍然不起作用@Johan
    【解决方案2】:

    错误正是 Python 告诉您的:int() 只能接受字符串、字节(另一种字符串)或数字,而您正在传递一个元组。这意味着self.total3 是一组像这样包装的值:(x,y,z)

    查看 sqlite 的 Python 文档,它似乎将数据库行作为元组返回,每个元组槽代表数据库的一列。您可以使用赋值或索引解开元组:

    col1, col2, col3 = row  # where row is (col1, col2, col3)
    col1 = row[0]  # indexed from 0
    

    当你遇到这样的问题时,我的第一步是总是找到有问题的冒犯值(这里是编译器向我们指出的“int() 参数”self.total3)和简单的print() 它看看哪里有问题。

    如果您不在此上下文之外使用它们,您可能不需要引入所有这些类状态变量 (self.xyz)。将局部变量用于仅在此上下文中使用的任何内容会更简单。

    【讨论】:

    • 我是否需要将“col1,col2,col3 = row”添加到代码中,因为如果不是我尝试了这种方法,因为我在 sql 数据库中有 9 列并且航班计数是第 9
    • 我会为我使用的任何表使用适当数量的col* 变量,这只是一个示例
    【解决方案3】:
    self.total3 = c.fetchone()
    total2 = int(self.total3)
    

    这里,self.total3 是整行。即使您选择了单个值,返回值也会包装在一个元组中。您需要从元组中获取您的值。

    self.total3 = c.fetchone()[0]
    total2 = int(self.total3)
    

    【讨论】:

      【解决方案4】:

      fetchone() 返回一个元组,因为它支持检索一行多个事物。在您的情况下,您选择了一个东西(flightcount),但您仍然必须将返回值视为一个元组。所以应该是:

      self.total3 = c.fetchone()[0]
      

      【讨论】:

        【解决方案5】:

        int() 只能解析一个值,不能解析一个元组。你可以做的是:

        total2 = [int(value) for value in self.total3] 
        

        那么,你有一个整数列表中的元组值。

        【讨论】:

        • 我认为 Johan 的回答更能说明你想要什么。
        【解决方案6】:

        尝试访问第一个元素:

        int(self.total3[0])

        self.total3 = cursor.fetchone()[0]

        【讨论】:

          猜你喜欢
          • 2018-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多