Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python int()参数必须是字符串、类似字节的对象或数字,而不是“tuple”_Python_Sql_String_Tkinter - Fatal编程技术网

Python int()参数必须是字符串、类似字节的对象或数字,而不是“tuple”

Python int()参数必须是字符串、类似字节的对象或数字,而不是“tuple”,python,sql,string,tkinter,Python,Sql,String,Tkinter,因此,我在本节中的代码应该从sql数据库中获取一个值,并将tkinter值添加到该数据库中,然后将该值放回sql数据库中 with sqlite3.connect('aircraft.db') as db: c = db.cursor() self.flightcount4 = self.flightcount5.get() self.flightcount3 = int(self.flightcount4) c.exec

因此,我在本节中的代码应该从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]

提前感谢

尝试访问第一个元素:

intself.total3[0]

self.total3=cursor.fetchone[0]

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

('flightcount value')
注意值周围那些讨厌的括号

出现错误的原因是intself.total3试图从c.fetchone解析整个元组行。相反,您需要从行中选择特定列,如下所示:

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

self.total3 = c.fetchone()[0]
total2 = int(self.total3)
fetchone返回一个元组,因为它支持检索一行多个内容。在本例中,您选择了一个单件flightcount,但仍然必须将返回值视为元组。因此,它应该是:

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

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

查看sqlite的Python文档,它似乎以元组的形式返回数据库行,每个元组槽表示数据库的一列。可以使用赋值或索引打开元组:

col1,col2,col3=行,其中行是col1,col2,col3 col1=从0索引的行[0] 当您遇到这样的问题时,我的第一步是始终在这里找到有问题的攻击性值,即编译器向我们指出的int参数self.total3,并简单地打印它,以查看哪里出错


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

int只能解析一个值,而不能解析元组。您可以做的是:

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

然后,在整数列表中有元组值。

我认为Johan的答案相当于说明了您想要的内容。我尝试了这样做,结果出现了相同的错误,我也尝试了不同的方法,因为我在sql数据库中有9列,我尝试了[8]和[9],这两列都是索引外的。您知道为什么吗?感谢you@AdamWilson这和以前的错误完全一样吗?尝试在self.total3=c.fetchone之后添加一个printself.total3,以及printself.total3[0]来查看self.total3中的实际值是什么。另外,请注意,您只需要关心SELECT子句中指定的列名索引。如果您的select子句看起来像select flightcount,ARRIM FROM…,那么flightcount在索引0上,ARRIM在索引1上,无论它们在实际数据库中是如何组织的。self.total3[0]的打印是无的。如果您查看上面的代码,我添加了一点,因为我无法将代码放在上面。这是我认为我应该走的方向,但它仍然不起作用@johan我是否需要在代码中添加col1,col2,col3=行,因为如果不这样做,我会尝试这种方法,因为我在sql数据库中有9列,航班计数是9,我会对我使用的任何表使用适当数量的col*变量,这只是一个例子
total2 = [int(value) for value in self.total3]