GeorgeWTrump
GeorgeWTrump

Reputation: 93

AttributeError: 'tuple' object has no attribute 'encode' - MySQL.connector.Python

Alrighty So this is the error

Traceback (most recent call last):
  File "C:/Users/Mandem/PycharmProjects/untitled/Pranks/Lib/site-packages/Ada.py", line 161, in <module>
    mycursor.execute(updaterScoren)
  File "C:\Users\Mandem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\mysql\connector\cursor.py", line 546, in execute
    stmt = operation.encode(self._connection.python_charset)
AttributeError: 'tuple' object has no attribute 'encode'

Process finished with exit code 1

This is the command I am trying to run

        f = int(input(
            "Kodeord - bemærk her, at kodeordene er pinkoderne fra min egen database, bare indtast en værdi mellem 1-6"))
        mycursor.execute("SELECT id,adresse,name,pinkode_brugt,score FROM bois WHERE id=%s", (f,))

        # MySQL Commands
        updaterScoren = "UPDATE bois SET pinkode_brugt = pinkode_brugt + 1 WHERE id = %s", (f,)

I am running it like this:

# MySQL Commands
        updaterScoren = "UPDATE bois SET pinkode_brugt = pinkode_brugt + 1 WHERE id = %s", (f,)

        myresult = mycursor.fetchall()

        row_count = mycursor.rowcount
        print(myresult)
        print("number of affected rows: {}".format(row_count))
        if row_count == 1:

            print(row_count)
            print(app.timerValue)
            while (i != app.timerValue) and (i <= app.timerValue) and (doorButton != 1) and (app.stopButton != 1):
                print('%.2f' % i)
                i = i + 0.01
                timeLeft = app.timerValue - i
                iTwo = app.timerValue
                print("THIS IS X", app.timerValue)
                time.sleep(0.01)
            # Hvis spillet stoppes, or i ikke når timerens slutværdi, vil scoren gemmes
            if (i != app.timerValue):
                score = i
                print("Dette er dit resultat: {}".format('%.2f' %score))
                mycursor.execute(updaterScoren)

Sidenote, is it possible to also use "myresult" somehow to identify which row to change/update? So that, something ala "UPDATE pinkode_brugt WHERE row = Myresult"

Here is my full code:

import threading
import tkinter as tk
import pip
import time
import mysql.connector
from time import sleep




# NY THREAD(s), der kan vise scoreboarden på en skærm.
class Timer(threading.Thread):
    def _init_(self):
        threading.Thread._init_(self)
        self.label = 0
        global score


    def run(self) -> None:
        self.master = tk.Tk()

        self.master.gemoetry("+0+0")

        self.master = tk.Label(self.root, bg = "black", fg = "red")

        self.timer.grid(row = 1, column = 2)

        self.master.mainloop()


class Tkinter(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.daemon = True
        self.root = 0
        self.entry = 0
        self.label = 0
        self.button = 0
        self.timerValue = 0
        self.stopButton = 0

        self.start()

    def run(self) -> 0:
        self.root = tk.Tk()

        # tkinter code goes here
        self.root.geometry("+2+0")
        self.root.config(background="black")

        self.label = tk.Label(self.root, bg="white", fg="black", font=("Fixedsys", 28))
        self.entry = tk.Entry(self.root, bg="white", fg="black", font=("Fixedsys", 28))
        self.stopTiden = tk.Button(self.root, bg="red", fg="white", text="Stop Spillet", command=self.stopTid)
        self.startTiden = tk.Button(self.root, bg="green", fg="white", text="Start Spillet", command=self.startTid)

        self.timerDisplay = tk.Label(self.root, bg="black", fg="red", text="Ceci n'est pas une timer")

        self.timerDisplay.grid(row=2, column=50)
        self.startTiden.grid(row=0, column=1)
        self.stopTiden.grid(row=0, column=10)
        self.entry.grid(row=1, column=1)
        self.label.grid(row=1, column=10)

        self.root.bind("<KeyPress>", self.read)
        self.root.mainloop()

    def displayTime(self):
        self.timerDisplay.config(text=i)

    def read(self, event):
        key = event.keysym
        try:
            if key == "Return":
                self.getA()
                self.visTid()
        except:
            self.fejlTidvalg()

    def startTid(self):
        self.stopButton = 0

    def getA(self):
        self.timerValue = float(self.entry.get().format("%.2f", 1.23456))
        print(self.timerValue)
        return self.timerValue

    def stopTid(self):
        self.stopButton = 1

    def visTid(self):
        self.label.config(text="Det her er timerens slutværdi: {}".format(self.timerValue))

    def fejlTidvalg(self):
        self.label.config(text="FEJL -Vælg Venligst Et Tal")


app = Tkinter()

stopTiden = 0

# Login til databasen
mydb = mysql.connector.connect(
    host="****",
    user="****",
    password="*****",
    database='mydatabase',
    auth_plugin='mysql_native_password'
)

doorButton = 0

while (doorButton != 1):
    stopButton = app.stopButton
    timerValue = app.timerValue
    iTwo = timerValue
    doorButton = 0
    i = 0.00
    mycursor = mydb.cursor()


    def countdown(i):

        while i:
            mins, secs = divmod(t, 60)
            timer = '{:02d}:{:02d}'.format(mins, secs)
            print(timer, end="\r")
            time.sleep(1)
            t -= 1


    # Servodøren skal åbnes her i denne kode
    while (app.stopButton != 1):
        # Indtast Pinkoden
        f = int(input(
            "Kodeord - bemærk her, at kodeordene er pinkoderne fra min egen database, bare indtast en værdi mellem 1-6"))
        mycursor.execute("SELECT id,adresse,name,pinkode_brugt,score FROM bois WHERE id=%s", (f,))

        # MySQL Commands
        updaterScoren = "UPDATE bois SET pinkode_brugt = pinkode_brugt + 1 WHERE id = %s", (f,)

        myresult = mycursor.fetchall()

        row_count = mycursor.rowcount
        print(myresult)
        print("number of affected rows: {}".format(row_count))
        if row_count == 1:

            print(row_count)
            print(app.timerValue)
            while (i != app.timerValue) and (i <= app.timerValue) and (doorButton != 1) and (app.stopButton != 1):
                print('%.2f' % i)
                i = i + 0.01
                timeLeft = app.timerValue - i
                iTwo = app.timerValue
                print("THIS IS X", app.timerValue)
                time.sleep(0.01)
            # Hvis spillet stoppes, or i ikke når timerens slutværdi, vil scoren gemmes
            if (i != app.timerValue):
                score = i
                print("Dette er dit resultat: {}".format('%.2f' %score))
                mycursor.execute(updaterScoren)


            else:
                print("Ingen point")
                mycursor.execute()


        i = 0
    # Her skal du tilføje i til den ID's row, der lige har åbnet via sin pinkode. Så er du stort set færdig! :D

Ps. I have looked at the other posts regarding the same issue. As far as I understood it, their solutions didn't help.

Upvotes: 1

Views: 1384

Answers (1)

Himanshu Sheoran
Himanshu Sheoran

Reputation: 1336

Changing updaterScoren = "UPDATE bois SET pinkode_brugt = pinkode_brugt + 1 WHERE id = %s", (f,) to updaterScoren = "UPDATE bois SET pinkode_brugt = pinkode_brugt + 1 WHERE id = %s" % f
should do the job as you are using format variables incorrectly

Upvotes: 1

Related Questions