因此,本节中我的代码应该从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]
预先感谢
答案 0 :(得分:3)
据我所知c.fetchone()
获取整行。即使您仅在SQL语句中指定一个值,它也将被包装在一个元组中。语法上,如果您尝试打印它,它将看起来像这样:
('flightcount value')
请注意值周围那些讨厌的括号。
出现错误的原因是因为int(self.total3)
试图解析c.fetchone()
中的整个元组(行)。相反,您需要从行中选择特定的列,如下所示:
int(self.total3[0])
答案 1 :(得分: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
),而简单地{{ 1}},以查看看起来有什么问题。
如果您不在此上下文之外使用它们,则可能不需要引入所有这些类状态变量(print()
)。将局部变量用于仅在此上下文中使用的任何内容会更简单。
答案 2 :(得分:1)
self.total3 = c.fetchone()
total2 = int(self.total3)
在这里,self.total3
是整行。即使选择了单个值,返回值也将包装在元组中。您需要从元组中获取价值。
self.total3 = c.fetchone()[0]
total2 = int(self.total3)
答案 3 :(得分:1)
fetchone()
返回一个元组,因为它支持检索多行内容。在您的情况下,您选择了一个东西(flightcount
),但是您仍然必须将返回值视为元组。所以应该是:
self.total3 = c.fetchone()[0]
答案 4 :(得分:0)
尝试访问第一个元素:
int(self.total3 [0])
或
self.total3 = cursor.fetchone()[0]
答案 5 :(得分:0)
int()只能解析一个值,而不是元组。您可以做的是:
total2 = [int(value) for value in self.total3]
然后,将元组值存储在整数列表中。