Missing 1 required positional argument: 'self'

Résolu/Fermé
Thewizy - Modifié le 15 sept. 2018 à 18:31
mamiemando Messages postés 33435 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 décembre 2024 - 19 sept. 2018 à 10:05
Bonjour,

J'essaye de crée un menu de jeu pour mon premier projet python. Je suis débutant et j'ai un problème en voulant importer mes jeux dans mon menu.

J'ai compris qu'il fallait utiliser
self
mais je ne sais pas pourquoi ça ne marche pas !
Je suis sous python 3.5 windows 10, et voila le message d'erreur:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Program Files\Python37\lib\tkinter\__init__.py", line 1702, in __call__
return self.func(*args)
File "C:/Users/manuel.gauthier/PycharmProjects/Apprentissage/Exercice.py", line 15, in <lambda>
c = Button(top, text="Just Price Game", command=lambda: just_price_game())
TypeError: just_price_game() missing 1 required positional argument: 'self'


Voila mon menu:

# !/usr/bin/python3
from tkinter import *
from dice import *
from justprice import *

top = Tk()
top.geometry("300x100")

def helloCallBack():
    msg = messagebox.showinfo( "Hello Python", "Hello World")


B = Button(top, text="Dice Game", command=lambda: dice_game())
B.place(x=50, y=50)
c = Button(top, text="Just Price Game", command=lambda: just_price_game())
c.place(x=150, y=50)
top.mainloop()


Et voila mon jeu qui pose problème:

def just_price_game(self):

    import datetime
    import time
    import webbrowser
    import random
    from colorama import Fore, Style

    seconds = 0
    # Données de temps
    update_time = datetime.datetime.now()
    time_given = update_time + datetime.timedelta(0, 60)  # days, seconds, then other fields.
    start_time = datetime.datetime.now()

    # Choisis un site au hasard et utilise le prix comme juste prix
    site_list = ["https://image.darty.com/gros_electromenager/refrigerateur-congelateur-refrigerateur-cong/refrigerateur-congelateur_haut/samsung_rt32k5000s9_t1603074206908A_163706861.jpg", "https://maxidiscount.ch/wp-content/uploads/2017/08/2017_0220_main1-1.jpg", "https://images.caradisiac.com/images/0/4/8/3/170483/S1-vente-aux-encheres-nouveau-record-pour-une-ferrari-250-gto-561193.jpg", "https://youtu.be/AFrppYjb-Hc", "https://www.achetermonchien.com/wp-content/uploads/sites/5/p1210939-810x550.jpg", "https://dyw7ncnq1en5l.cloudfront.net/optim/produits/363/42243/nvidia-titan-xp-collector-s-edition-star-wars_d647a13fe3d76576__450_400.jpg", "https://static.bhphoto.com/images/images500x500/apple_mqk62ll_a_watch_series_3_42mm_1505400411000_1362215.jpg", "http://www.investir-actif.com/wp-content/uploads/2014/04/lingot-or-1kg-gold-bar.jpg", "https://www.deltanautic.fr/8502/barque-armor-ria-430.jpg", "https://i2.cdscdn.com/pdt2/5/4/3/1/700x700/nes0000003111543/rw/nespresso-lot-de-cafe-fort-50-capsules.jpg", "https://picclick.com/Lollapalooza-2018-Wristband-Tickets-Chicago-SUNDAY-8-5-General-163176618876.html#&gid=1&pid=1"]
    price_list = [629, 58, 44000000, 5700000, 1200, 1485, 399, 38000, 1750, 39, 335]
    just_price_site = random.sample(site_list, 3)

    index_site_list = site_list.index(just_price_site[0])
    just_price = (price_list[index_site_list])

    # The value that the player Bet
    user_price = 0
    # Set count and points
    self.count = 0
    # count + 1 point after achieving a level
    self.point = 0

    self.last_chance = 0
    print("Le but du jeu est de trouvé le juste prix de trois objets qui te seront montrer si tu y arrive tu sera gratifier en ayant ton pseudo dans les logs du jeu!")

    diff = input("Choisis la difficulté a laquel tu veux jouer!(F/M/D) pour facile/moyen/difficile(obvious)")

    if diff == "F":

        print("Tu as choisis le mode Facile tu as 3 niveaux a passer accroche toi! ")
        seconds = 75
        webbrowser.open(just_price_site[point])
    if diff == "M":
        print("Tu as choisis le mode Moyen tu as 3 niveaux a passer accroche toi! ")
        seconds = 60
        webbrowser.open(just_price_site[point])

    if diff == "D":
        print("Tu as choisis le mode difficile, tu as 3 niveaux a passer accroche toi!  ")
        seconds = 45
        webbrowser.open(just_price_site[point])

    def game(self):

            global seconds, time_given, start_time, point, count, last_chance
            while True:

                print("Vous avez", seconds, "seconds pour trouver la valeur du biens (l'objet est toujours neuf!)")
                ready = input("Vous êtes prêt ?(oui, non)")
                if ready == "oui":

                    print("3")
                    time.sleep(1)

                    print("2")
                    time.sleep(1)

                    print("1")
                    time.sleep(1)

                    update_time = datetime.datetime.now()
                    time_given = update_time + datetime.timedelta(0, seconds)
                    start_time = datetime.datetime.now()

                    break

                elif ready == "non":
                    print("Tant pis pour toi le jeu à déja commencé!")
                    break

                else:
                    print("(L'indécision et l'inaction sont les parents de l'échec.) citation de Pierre Louis de Lacretelle :)")

            running = True
            while running:
                try:

                    update_time = datetime.datetime.now()
                    countdown = time_given - update_time
                    time_taken = update_time - start_time

                    if update_time < time_given:
                        print("il reste", countdown, "secondes dépèche toi!")
                    # arrète le jeu après 60s il a le droit a une dernière chance
                        print(Style.RESET_ALL)
                    elif update_time > time_given:
                        print("Temps écoulé!")
                        last_chance = int(input("Je suis gentil je te laisse une dèrnière chance!"))

                        if last_chance == just_price:
                            print("Bravo c'était juste... mais vous avez trouvé le juste prix au dernière essaie !")
                            print("le juste prix était bien", just_price, "CHF.")
                            count += 1
                            print("Cela vous a demandé", count, "essaies.")
                            # fin du jeu
                            point += 1
                            break

                        elif last_chance != just_price_site:
                            print("Le juste prix était", just_price, ",dommage tu réussira la prochaine fois!")
                            quit()
                    # demander à l'utilisateur d'entrer un prix dans la console
                    user_price = int(input("Entrer un prix: "))
                    print("____________________________________________________________________")
                    # si le prix est le meme que le juste prix

                    if user_price == just_price:
                        print("Bravo vous avez trouvé en", time_taken, "secondes !")
                        print("le juste prix était bien", just_price, "CHF.")
                        count += 1
                        print("Cela vous a demandé", count, "essaies.")
                        point += 1
                        # fin du jeu
                        break

                    elif user_price > just_price:
                        print(Fore.BLUE + "C'est moins")
                        count += 1
                    # si le prix de l'utilisateur est inférieur au prix à trouver

                    elif user_price < just_price:
                        print(Fore.RED + "C'est plus")
                        count += 1

                except ValueError:
                    print("Oops!")

    game(self)

    # level 1
    if point == 1:
        print(Fore.YELLOW + "-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-")
        print("Tu es arrivé au niveau 2 ! es-tu prêt?")
        webbrowser.open(just_price_site[1])
        index_site_list = site_list.index(just_price_site[point])
        just_price = (price_list[index_site_list])
        count = 0
        seconds -= 15
        print(Style.RESET_ALL)
        game(self)

    # level 2

    if point == 2:
        print(Fore.YELLOW + "-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_")
        print("Bien joué tu es arrivé jusqu'au dernier Niveau es-tu prêt?")
        webbrowser.open(just_price_site[2])
        index_site_list = site_list.index(just_price_site[point])
        just_price = (price_list[index_site_list])
        count = 0
        seconds -= 15
        print(Style.RESET_ALL)
        game(self)

    print(Fore.YELLOW + "VICTOIRE ! TU AS REUSSI TOUT LES NIVEAUX BRAVO!")

    # Winner get to write his name in the winner.txt file

    def winner(self):      # Function name.

        fwu = open('winner.txt', 'w')     # create or open user.txt file.
        while True:
            self.winner = input("Username: ")     # takes the user input.e.g what username to register

            if len(winner) <= 12:
                fwu.write(winner)              # this command should write input into the file
                fwu.close()
            else:
                print("The username length is too long (max 12")

    winner()


Merci d'avance pour toute aide donner je suis vraiment coincer je ne trouve rien sur le net!

A voir également:

1 réponse

mamiemando Messages postés 33435 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 décembre 2024 7 810
Modifié le 15 sept. 2018 à 18:41
Bonjour


Concernant ton problème :
  • self
    est un nom utilisé quand on fait de la programmation objet en python, voir le mot clé
    class
    . Ici tu n'as pas de classe, donc
    self
    est vu comme un argument de la fonction
    just_price_game
    . Cette fonction attend donc un paramètre. Or à l'appel, tu n'en passes aucun, d'où le message d'erreur. A priori il n'y aucune raison dans ton cas de passer un tel argument.
  • Évite de définir des fonctions dans des fonctions tant que tu débutes. Idem pour les
    import
    . Tant que tu débutes je te conseille d'écrire par exemple :


#!/usr/bin/env python3
import package1
import package2
from package3 import truc1, truc2
...

def fonction1( ... ):
  instruction11
  instruction12

def fonction2( ... ):
  instruction21
  instruction22

...

def main(): # programme principale
  instruction_main1
  instruction_main2

main()
  • Quand tu seras plus à l'aise, tu pourras commencer à faire des classes :


#!/usr/bin/env python3
import package1
import package2
from package3 import truc1, truc2

...
class Classe1:
  def __init__(self, ...):
    instruction1
    instruction2

  def methode1(self, ...):
    instruction1
    instruction2

  ...
...

def fonction1( ... ):
  instruction11
  instruction12

def fonction2( ... ):
  instruction21
  instruction22

...

def main(): # programme principale
  instruction_main1
  instruction_main2

main()


Bonne chance
3
Merci Beaucoup pour votre réponse cela ma été très utile !
0
mamiemando Messages postés 33435 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 décembre 2024 7 810
17 sept. 2018 à 10:30
Tant mieux, c'était le but :-) Est-ce que tu es parvenu à résoudre ton problème ? Si oui, bascule ton sujet en résolu.
0
Oui niquel merci je le passe en résolu!
0
Je ne peux pas le fermer moi même je n'ai pas de compte :/
0
mamiemando Messages postés 33435 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 décembre 2024 7 810
19 sept. 2018 à 10:05
Effectivement, je m'en occupe. Tu peux en créer un pour tes prochaines questions -si tu en as-, c'est assez pratique et ça permet de naviguer plus facilement sur le site pour retrouver les questions que tu as posées et auxquelles tu as répondu.

D'ici là, bonne continuation
0