Аргумент int () должен быть строкой, байтовоподобным объектом или числом, а не 'tuple' - PullRequest
0 голосов
/ 07 апреля 2019

так что, по идее, мой код в этом разделе должен получить значение из базы данных 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]

заранее спасибо

Ответы [ 6 ]

3 голосов
/ 07 апреля 2019

Насколько я знаю c.fetchone() извлекает весь ряд.Даже если вы укажите только одно значение в SQL-выражении, оно будет заключено в кортеж.Синтаксис выглядит так, если вы попытаетесь его напечатать:пытается разобрать весь кортеж (строку) из c.fetchone().Вместо этого вам нужно выбрать конкретный столбец из строки, например:

int(self.total3[0])
2 голосов
/ 07 апреля 2019

Ошибка - это именно то, что говорит вам Python: int() может принимать только строки, байты (строки другого типа) или числа, и вы передаете кортеж. Это означает, что self.total3 - это некоторый набор значений, обернутый следующим образом: (x,y,z).

Глядя на документы Python sqlite, кажется, что он возвращает строки базы данных в виде кортежей, где каждый слот кортежа представляет столбец базы данных. Вы можете развернуть кортеж с помощью присваивания или индексации:

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

Когда вы сталкиваетесь с такой проблемой, мой первый шаг - всегда находить оскорбительное значение (здесь аргумент int (), который указывает нам компилятор, self.total3) и просто print() it чтобы увидеть, что выглядит не так.

Возможно, вам не нужно вводить все эти переменные состояния класса (self.xyz), если вы не используете их вне этого контекста. Было бы проще использовать локальные переменные для всего, что используется только в этом контексте.

1 голос
/ 07 апреля 2019

fetchone() возвращает кортеж, поскольку он поддерживает извлечение ряда из нескольких вещей. В вашем случае вы выбрали одну вещь (flightcount), но вы все равно должны рассматривать возвращаемое значение как кортеж. Так и должно быть:

self.total3 = c.fetchone()[0]
1 голос
/ 07 апреля 2019
self.total3 = c.fetchone()
total2 = int(self.total3)

Здесь self.total3 - весь ряд.Даже если вы выбрали одно значение, возвращаемое значение оборачивается в кортеж.Вы должны получить свою ценность из кортежа.

self.total3 = c.fetchone()[0]
total2 = int(self.total3)
0 голосов
/ 07 апреля 2019

int () может анализировать только одно значение, но не кортеж. Что вы можете сделать, это:

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

тогда у вас есть значения кортежа в списке целых чисел.

0 голосов
/ 07 апреля 2019

Попробуйте получить доступ к первому элементу:

int (self.total3 [0])

или

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...