2017-10-17 18 views
-2

Je suppose que cette question a déjà été postée plusieurs fois, mais je commence en python 3 et je ne comprends pas comment corriger cette erreur, j'ai essayé mais. .. s'il vous plaît quelqu'un pourrait-il m'aider? Je dois faire un système de distribution de café, le but ici est: donner une pièce qui doit nécessairement être 5, 10 ou 25, le client a 4 tests s'il donne une mauvaise pièce, le total doit atteindre CHF 55, donc il doit saisir jusqu'à obtenir CHF 55.python pour fixer l'objet 'NoneType' n'a pas d'attribut 'delete'

import os 
import datetime 
import time 
from tkinter import * 
from tkinter.filedialog import * 

class Welcome(): 

    def __init__(self,master): 
     self.master = master 
     self.master.title('coffee distributor') 
     self.master.geometry('700x400+0+0') 
     self.title = Label(self.master, font=('arial', 35, 'bold'),text='[coffee distributor]',relief='solid', bg='powder blue' , fg='darkslategray', padx=20, pady=20).place(x=10, y=10) 
     self.menu1 = Button(self.master, font=('Helvetica',16,'bold') , text='[order coffee]' , padx=30 , relief='sunken',bg='darkslategray' ,fg='white', command=self.gotocmd).place(x=150,y = 140) 

    def gotocmd(self): 
     root = Toplevel(self.master) 
     myGui1 = OrderCoffee(root) 



class OrderCoffee(): 

    def __init__(self ,master): 
     self.coin = IntVar() 
     self.c_25 = self.c_10 = self.c_5 = self.error = 0 
     self.total = 0 
     self.master = master 
     self.master.title('coffee distributor') 
     self.master.geometry('900x400+0+0') 
     self.frame1 = Frame(self.master, relief=RAISED, borderwidth=1, bg='darkslategray').pack(fill=BOTH, expand=True) 
     self.info = Label(self.master, font=('arial', 15, 'bold'), text="[To order a coffee, please enter a coin \n The price of one cup of coffee is set at CHF 55 \n We accept that the following coins: [10, 25, 50]", padx=20, pady=20,relief='sunken', bg='darkslategray' ,fg='white').place(x=170 , y=10) 

     self.info2 =Label(self.master, text="[dashboard ]", padx=10 , pady=10, relief='sunken', bg='darkslategray' ,fg='white').place(x=10 , y=120) 
     self.rapport = Text(self.master , width=50 , height=10 , bg='powder blue', fg='darkslategray').place(x=10 , y=160) 

     self.lb_piece = Label(self.master , text="[enter a coin ]", font=('arial', 15, 'bold'), padx=10, pady=10,relief='sunken', bg='darkslategray' ,fg='white').place(x=500 , y=160) 
     self.input_piece = Entry(self.master, textvariable=self.coin, justify='right', font=('arial', 15, 'bold'), bd=5 ,relief='sunken', bg='powder blue' ,fg='white').place(x=500, y=220) 

     self.cmd = Button(self.master , text="order", font=('arial', 15, 'bold'), bd=4 ,relief='sunken', bg='darkslategray' ,fg='white' , command=self.verification).place(x=500, y=270) 
     self.ncmd = Button(self.master, text="back", font=('arial', 15, 'bold'), bd=4,relief='sunken', bg='darkslategray' ,fg='white').place(x=650, y=270) 

    #methode pour afficher resultat 
    def result(self): 
     self.rapport.delete() 
     self.rapport.insert(END, '5 coin :\t\t' + str(self.c_5) + '\n') 
     self.rapport.insert(END, '10 coin:\t\t' + str(self.c_10) + '\n') 
     self.rapport.insert(END, '25 coin :\t\t' + str(self.c_25) + '\n') 
     self.rapport.insert(END, 'error :\t\t' + str(self.error) + '\n') 
     self.rapport.insert(END, 'TOTAL    \t\t' + str(self.total) + '\n') 

    #méthode qui réçoit une pièce pour compter 
    def add_coin(self): 
     coin = int(self.coin.get()) 
     if self.coin == 5: 
      self.c_5 +=1 
      self.total += 5 
     elif self.coin == 10: 
      self.c_10 +=1 
      self.total += 10 
     elif self.coin == 25: 
      self.c_25 += 1 
      self.total += 25 
     else: 
      self.error +=1 

    def verification(self): 
     if self.total >= 55: 
      self.result() 
      print('done') 
     else: 
      self.add_coin() 
      self.result() 
      print('add again') 



def main(): 
    root = Tk() 
    First = Welcome(root) 
    root['bg'] ='darkslategray' 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

Je ne comprends pas comment résoudre cette erreur:

"C:\Users\dell computer\AppData\Local\Programs\Python\Python36\python.exe" "C:/Users/dell computer/PycharmProjects/projet/test.py" 
Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\dell computer\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1699, in __call__ 
    return self.func(*args) 
    File "C:/Users/dell computer/PycharmProjects/projet/test.py", line 73, in verification 
    self.result() 
    File "C:/Users/dell computer/PycharmProjects/projet/test.py", line 45, in result 
    self.rapport.delete() 
AttributeError: 'NoneType' object has no attribute 'delete' 

Nous vous remercions à l'avance

Répondre

0

L'utilisation d'un gestionnaire de géométrie .pack(), .place() ou .grid() sur un widget lors de la déclaration entraînera la valeur None de la variable, car les gestionnaires de géométrie renvoient None.

Cela signifie que le déclarant ci-dessous ...

Label = Label(root, text="Text").place() 

signifie que Label est égal à None avec le type NoneType.

Alors essaie de le faire ...

Label.destroy() 

signifie en fait que vous essayez de le faire ...

NoneType.destroy() 

Ce que vous devez faire est plutôt quelque chose comme le ci-dessous:

Label = Label(root, text="Text") 
Label.place() 

Cela signifie Label est égal à un widget tk Label. Vous pouvez donc exécuter des fonctions telles que .destroy().

0

Cette ligne est le problème:

self.rapport = Text(self.master , width=50 , height=10 , bg='powder blue', fg='darkslategray').place(x=10 , y=160) 

Lorsque vous méthode de la chaîne des appels comme ça, vous attribuez la valeur de retour du dernier appel à votre variable, ce qui serait None en cas de place(). Séparez les appels à la place et placez chacun sur sa propre ligne. Cependant, lorsque vous surmontez ce problème, il y en a un autre - vous devez spécifier des indices lorsque vous supprimez dans votre result la fonction:

self.rapport.delete('1.0', END) 
self.rapport.delete('1.0', END)