Error when I close a windows with GTK3/Glade/Python - python

I have a probleme with my interface glade. I can open my interface, no problem with that, It's work in the way I want but when I close it all the main programm stop and I have two messages in the consol
(BouclePrincipal.py:50516): Gtk-CRITICAL **: 09:01:00.615: gtk_widget_get_accessible: assertion 'GTK_IS_WIDGET (widget)' failed>
(BouclePrincipal.py:50516): Atk-CRITICAL **: 09:01:00.615: atk_object_remove_relationship: assertion 'ATK_IS_OBJECT (target)' failed
I don't understand what/where is the problem. I tried to add return true like the following
answer but it's dosn't work. Furthermore I don't know what I need to post for this problem (interface glad ? the init in python ?)
here the python code
# on importe les librairies dont nous avons besoins
import gi
import sqlite3
import Alerte
import datetime
import AjouterMedicament
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
Idutilisateur = 0
# on creer la classe pour l'interface
class AffichageEcritureIP:
# ligne de code qui se lance lorsque de l'initialisation
def __init__(self):
# on creer la fenetre à partir de l'interface glade
self.builder = Gtk.Builder()
self.builder.add_from_file('EcritureIP.glade')
self.window = self.builder.get_object('Main_Windows_IP')
# on creer des objetrs pour chaqu'une des interractions
self.builder.connect_signals(self)
# on creer les variables
self.DateIP = self.builder.get_object("DateRealisation")
self.Service = self.builder.get_object("Services")
self.NomPatient = self.builder.get_object("NomPatient")
self.PrenomPatient = self.builder.get_object("PrenomPatient")
self.Age = self.builder.get_object("Age")
self.UniteAge = self.builder.get_object("UniteAge")
self.Sexe = self.builder.get_object("Sexe")
self.Probleme = self.builder.get_object("Probleme")
self.Intervention = self.builder.get_object("Intervention")
self.ATC1 = self.builder.get_object("ClasseATC1")
self.ATC2 = self.builder.get_object("ClasseATC2")
self.ProblemeDescription = self.builder.get_object("ProblemeDescription")
self.Devenir = self.builder.get_object("DevenirIntervention")
self.RetourMedecin = self.builder.get_object("RetourMedecin")
self.Medoc1 = self.builder.get_object("Médicament1")
self.Medoc2 = self.builder.get_object("Médicament2")
self.Prescripteur = self.builder.get_object("Prescripteur")
self.Contact = self.builder.get_object("Contact")
self.CotationClinique = self.builder.get_object("CotationClinique")
self.CotationEconomique = self.builder.get_object("CotationEconomique")
self.CotationOrga = self.builder.get_object("CotationOrga")
self.Conciliation = self.builder.get_object("Conciliation")
self.Poids = self.builder.get_object("Poids")
self.RetourMedecin = self.builder.get_object("RetourMedecin")
self.DateMedecin = self.builder.get_object("DateMedecin")
self.NumIP = self.builder.get_object("NumIP")
# on affecte la date du jour à l'entrée
dateBrut = datetime.datetime.now()
DateJour = FormatDate(dateBrut.day, dateBrut.month, dateBrut.year)
self.DateIP.set_text(DateJour)
#on va creer les listes pour remplir les listes déroulantes
conn = sqlite3.connect('déclaration.db')
cursor = conn.cursor()
cursor.execute("""SELECT NomService FROM Service """)
self.ListeService = cursor.fetchall()
cursor.execute("""SELECT Description FROM Probleme """)
ListeProbleme = cursor.fetchall()
cursor.execute("""SELECT Description FROM Resolution """)
ListeResolution = cursor.fetchall()
cursor.execute("""SELECT Description FROM ATC """)
ListeATC = cursor.fetchall()
cursor.execute("""SELECT Description FROM Devenir """)
ListeDevenir = cursor.fetchall()
cursor.execute("""SELECT Description FROM Prescripteur """)
ListePrescripteur = cursor.fetchall()
cursor.execute("""SELECT Description FROM Transmission """)
ListeTransmission = cursor.fetchall()
cursor.execute("""SELECT Description FROM CotationClinique """)
ListeCotationClinique = cursor.fetchall()
cursor.execute("""SELECT Description FROM CotationEconomique """)
ListeCotationEconomique = cursor.fetchall()
cursor.execute("""SELECT Description FROM CotationOrganisationnel """)
ListeCotationOrga = cursor.fetchall()
cursor.execute("""SELECT Libelle FROM Medoc ORDER BY Libelle ASC""")
self.ListeMedoc = cursor.fetchall()
cursor.execute("""SELECT Libelle FROM Sexe """)
ListeSexe = cursor.fetchall()
cursor.execute("""SELECT Libelle FROM UniteAge """)
ListeUniteAge = cursor.fetchall()
conn.close()
# on va rajouter les services dans la liste
for service in self.ListeService:
self.Service.append_text(service[0])
# on va rajouter les problemes dans la liste
for probleme in ListeProbleme:
self.Probleme.append_text(probleme[0])
# on va rajouter les resolutions dans la liste
for resolution in ListeResolution:
self.Intervention.append_text(resolution[0])
# on va rajouter les classe ATC dans la liste
for resolution in ListeATC:
self.ATC1.append_text(resolution[0])
self.ATC2.append_text(resolution[0])
# on va rajouter les Devenir dans la liste
for resolution in ListeDevenir:
self.Devenir.append_text(resolution[0])
# on va rajouter les prescripteur dans la liste
for resolution in ListePrescripteur:
self.Prescripteur.append_text(resolution[0])
# on va rajouter le contact dans la liste
for resolution in ListeTransmission:
self.Contact.append_text(resolution[0])
# on va rajouter les cotation clinique dans la liste
for resolution in ListeCotationClinique:
self.CotationClinique.append_text(resolution[0])
# on va rajouter les cotation economique dans la liste
for resolution in ListeCotationEconomique:
self.CotationEconomique.append_text(resolution[0])
# on va rajouter les cotation Orga dans la liste
for resolution in ListeCotationOrga:
self.CotationOrga.append_text(resolution[0])
# on va rajouter les cotation Orga dans la liste
for resolution in self.ListeMedoc:
self.Medoc1.append_text(resolution[0])
self.Medoc2.append_text(resolution[0])
# on va rajouter les sexe dans la liste
for resolution in ListeSexe:
self.Sexe.append_text(resolution[0])
# on va rajouter les unite d'age dans la liste
for resolution in ListeUniteAge:
self.UniteAge.append_text(resolution[0])
#on va creer l'autocomplete pour les medicament
self.liststoreMedoc = Gtk.ListStore(str)
for s in list(sum(self.ListeMedoc,())):
self.liststoreMedoc.append([s])
self.autocompletemedoc = Gtk.EntryCompletion()
self.autocompletemedoc.set_model(self.liststoreMedoc)
self.autocompletemedoc.set_text_column(0)
self.builder.get_object("EntreMedoc1").set_completion(self.autocompletemedoc)
self.builder.get_object("EntreMedoc2").set_completion(self.autocompletemedoc)
def ClicConciliation(self, widget):
if self.Conciliation.get_label() == "Non":
self.Conciliation.set_label("Oui")
else:
self.Conciliation.set_label("Non")
def ValidationIP(self, widget):
global Idutilisateur
# on commence par verifier que les donne importante sont saisie
continuer = 0
if len(self.DateIP.get_text()) == 0:
Alerte.appelAffichageAlerte("Il faut saisir la date")
continuer = 1
if len(self.Service.get_active_text()) == 0:
Alerte.appelAffichageAlerte("Il faut saisir le service")
continuer = 1
if len(self.Age.get_text()) == 0:
Alerte.appelAffichageAlerte("Il faut saisir l'age du patient")
continuer = 1
if self.UniteAge.get_active_text() is None:
Alerte.appelAffichageAlerte("Il faut saisir l'unite de l'age du patient")
continuer = 1
if self.Sexe.get_active_text() is None:
Alerte.appelAffichageAlerte("Il faut saisir le sexe du patient")
continuer = 1
if self.Probleme.get_active_text() is None:
Alerte.appelAffichageAlerte("Il faut saisir le probleme")
continuer = 1
if self.Intervention.get_active_text() is None:
Alerte.appelAffichageAlerte("Il faut saisir l'intervention")
continuer = 1
if self.Prescripteur.get_active_text() is None:
Alerte.appelAffichageAlerte("Il faut saisir le prescripteur")
continuer = 1
if len(self.Medoc1.get_active_text()) == 0:
Alerte.appelAffichageAlerte("Il faut saisir le médicament")
continuer = 1
if self.Devenir.get_active_text() is None:
Alerte.appelAffichageAlerte("Il faut saisir le devenir de l'IP")
continuer = 1
# on creer un tableau avec les IP qui necessitent de saisir un autre médicaments
IPavecdeuxMedoc = [15, 19, 20, 21, 22, 23, 24, 25, 34]
# on rajoute 1 à l'ID car le premier de la liste à l'ID 0
IDProbleme = (self.Probleme.get_active() + 1)
if IDProbleme in IPavecdeuxMedoc and len(self.Medoc2.get_active_text()) == 0:
Alerte.appelAffichageAlerte("Il faut saisir le second médicament pour cette intervention")
continuer = 1
if continuer == 1:
pass
else:
# on va donc ajouter l'IP dans la base
global Idutilisateur
# on transformer la conciliation en 1 ou 0
if self.Conciliation.get_label() == "Non":
Conciliation = 0
else:
Conciliation = 1
#on va verifier que le/les medoc(s) saisi existe bien dans la base de donnée
# on verifie si le service fait partie de la liste
# on va transformer la liste de tuple en list pur
if self.Medoc1.get_active_text() in list(sum(self.ListeMedoc,())):
pass
else:
AjouterMedicament.appelAffichageAjoutMedicament(self.Medoc1.get_active_text(), self.ATC1.get_active(),1)
if self.Medoc2.get_active_text()=="" or self.Medoc2.get_active_text() in list(sum(self.ListeMedoc,())):
pass
else:
AjouterMedicament.appelAffichageAjoutMedicament(self.Medoc2.get_active_text(), self.ATC2.get_active(),1)
# on va chercher le code UCD et l'id du médicament
conn = sqlite3.connect('déclaration.db')
cursor = conn.cursor()
cursor.execute("SELECT id,CodeUCD FROM Medoc WHERE Libelle = ?", (self.Medoc1.get_active_text(),))
Medicament1 = cursor.fetchone()
if self.Medoc2.get_active_text() == "":
Medicament2 =[0,0]
else:
cursor.execute("SELECT id,CodeUCD FROM Medoc WHERE Libelle = ?", (self.Medoc2.get_active_text(),))
Medicament2 = cursor.fetchone()
conn.close()
# on va creer des variable pour les texte
# pour le TextViewer le texte est lié à une Buffer de Texte
# pour afficher le texte il est necessaire d'avoir le début et la fin du texte
# on creer donc le début et la fin et on l'inclut dans
iterdebut, iterfin = self.ProblemeDescription.get_bounds()
DescriptionProbleme = str(self.ProblemeDescription.get_text(iterdebut, iterfin, include_hidden_chars=True))
iterdebut2, iterfin2 = self.RetourMedecin.get_bounds()
RetourMedecin = str(self.RetourMedecin.get_text(iterdebut2, iterfin2, include_hidden_chars=True))
# on creer une liste de tuplue pour fussioner avec la liste pour inserer les donnes
IP = [(str(self.DateIP.get_text()),
Idutilisateur,
str(self.NomPatient.get_text()),
str(self.PrenomPatient.get_text()),
str(self.Age.get_text()),
self.UniteAge.get_active()+1,
self.Sexe.get_active()+1,
str(self.Poids.get_text()),
self.Probleme.get_active() + 1,
Medicament1[0],
Medicament1[1],
self.ATC1.get_active()+1,
Medicament2[0],
Medicament2[1],
self.ATC2.get_active()+1,
self.Service.get_active() + 1,
DescriptionProbleme,
self.Intervention.get_active() + 1,
self.Prescripteur.get_active() + 1,
self.Contact.get_active() + 1,
self.DateMedecin.get_text(),
self.Devenir.get_active() + 1,
self.CotationClinique.get_active() + 1,
self.CotationEconomique.get_active() + 1,
self.CotationOrga.get_active() + 1,
Conciliation,
RetourMedecin)]
# pour reussir à faire l'insertion des données avec le Update , on creer une liste avec les noms de colonne
ColonneSQL = [
"DateSaisie",
"Utilisateur",
"NomPatient",
"PrenomPatient",
"AgePatient",
"UniteAgePatient",
"SexePatient",
"Poids",
"Probleme",
"Medicament1",
"CodeUCD1",
"ATC1",
"Medicament2",
"CodeUCD2",
"ATC2",
"Service",
"DescriptionProbleme",
"Intervention",
"Prescripteur",
"Transmission",
"DateContactMedecin",
"DevenirIntervention",
"CotationClinique",
"CotationEconomique",
"CotationOrganisationnel",
"Conciliation",
"JustificatifIntervention"
]
#on creer une liste pour faire un for sur les nombres
nombre = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]
# on se connecte à la base
conn = sqlite3.connect('déclaration.db')
cursor = conn.cursor()
# on va utiliser l'interface pour saisir et modifier les IP
# on va donc verifier si le numeroIP est saisie, dans la textbox, si ce n'est pas le cas on ajoute et on
# affiche le numero IP
# si c'est n'ai pas le cas on verifie que l'IP existe est on la met à jour
if len(self.NumIP.get_text()) == 0:
for i in IP:
cursor.execute(
"INSERT INTO Intervention(DateSaisie,Utilisateur,NomPatient,PrenomPatient,AgePatient,"
"UniteAgePatient,SexePatient,Poids,Probleme,Medicament1,CodeUCD1,ATC1,Medicament2,CodeUCD2,"
"ATC2,Service,DescriptionProbleme,Intervention,Prescripteur,Transmission,DateContactMedecin,"
"DevenirIntervention,CotationClinique,CotationEconomique,CotationOrganisationnel,Conciliation,"
"JustificatifIntervention) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", i)
id = cursor.lastrowid
message = "Féliciation vous avez sauvegarder votre IP sous le numero " + str(id)
self.NumIP.set_text(str(id))
Alerte.appelAffichageAlerte(message)
conn.commit()
conn.close()
else:
# on va tester voir si le numero de l'IP existe
cursor.execute("SELECT count(*) FROM Intervention WHERE id= ?", (int(self.NumIP.get_text()),))
IpExiste = cursor.fetchone()
if IpExiste[0] == 0:
Alerte.appelAffichageAlerte("L'IP n'existe pas")
conn.close()
else:
# on creer une boucle pour mettre à jour l'IP
for i in nombre:
sql = "UPDATE Intervention SET " + ColonneSQL[i] + "=? WHERE id=" + str(self.NumIP.get_text())
cursor.execute(sql, (IP[0][i],))
conn.commit()
conn.close()
def Lecture(self,widget):
"""
Cette fonction permet de lire la BDD et si , l'IP existe, mettre l'ensemble des données dans l'interface.
"""
if self.NumIP.get_text() is None or self.NumIP.get_text()=="":
self.effacerinterface(self)
else:
conn = sqlite3.connect('déclaration.db')
cursor = conn.cursor()
cursor.execute("SELECT count(*) FROM Intervention WHERE id= ?", (int(self.NumIP.get_text()),))
IpExiste = cursor.fetchone()
if IpExiste[0] == 1:
cursor.execute("SELECT * FROM Intervention WHERE id= ?",(int(self.NumIP.get_text()),))
ip_complete = cursor.fetchone()
cursor.execute("SELECT Libelle FROM Medoc WHERE id= ?",(int(ip_complete[10]),))
NomMedicament1 = cursor.fetchone()
if int(ip_complete[13])==0:
NomMedicament2=[""]
else:
cursor.execute("SELECT Libelle FROM Medoc WHERE id= ?",(int(ip_complete[13]),))
NomMedicament2 = cursor.fetchone()
conn.close()
self.DateIP.set_text(ip_complete[1])
self.Service.set_active(int(ip_complete[16])-1)
self.NomPatient.set_text(ip_complete[3])
self.PrenomPatient.set_text(ip_complete[4])
self.Age.set_text(str(ip_complete[5]))
self.UniteAge.set_active(ip_complete[6]-1)
self.Sexe.set_active(ip_complete[7] - 1)
self.Poids.set_text(ip_complete[8])
self.Probleme.set_active(ip_complete[9]-1)
self.builder.get_object("EntreMedoc1").set_text(NomMedicament1[0])
self.ATC1.set_active(ip_complete[12]-1)
self.builder.get_object("EntreMedoc2").set_text(NomMedicament2[0])
self.ATC2.set_active(ip_complete[15]-1)
self.ProblemeDescription.set_text(ip_complete[17])
self.Intervention.set_active(ip_complete[18]-1)
self.Prescripteur.set_active(ip_complete[19]-1)
self.Contact.set_active(ip_complete[20]-1)
self.DateMedecin.set_text(ip_complete[21])
self.Devenir.set_active(ip_complete[22]-1)
self.CotationClinique.set_active(ip_complete[23]-1)
self.CotationEconomique.set_active(ip_complete[24]-1)
self.CotationOrga.set_active(ip_complete[25]-1)
if ip_complete[26]==self.Conciliation.get_label():
pass
else:
self.Conciliation.activate()
self.RetourMedecin.set_text(ip_complete[27])
else:
self.effacerinterface(self)
def ChangementMedicament1(self,widget):
"""
Permet de changer le code ATC automatiquement quand on saisie un médicament dans la bare 1
"""
if self.builder.get_object("EntreMedoc1").get_text()=="":
pass
else:
conn = sqlite3.connect('déclaration.db')
cursor = conn.cursor()
SQL = "SELECT ClasseATC FROM Medoc WHERE Libelle= ?"
Val = self.builder.get_object("EntreMedoc1").get_text()
cursor.execute(SQL ,(Val,) )
ClassATC = cursor.fetchone()
if cursor.rowcount <0:
self.builder.get_object("EntreClasseATC1").set_text("")
else:
self.ATC1.set_active(ClassATC[0] - 1)
def ChangementMedicament2(self,widget):
"""
Permet de changer le code ATC automatiquement quand on saisie un médicament dans la bare 2
"""
if self.builder.get_object("EntreMedoc2").get_text()=="":
pass
else:
conn = sqlite3.connect('déclaration.db')
cursor = conn.cursor()
SQL = "SELECT ClasseATC FROM Medoc WHERE Libelle= ?"
Val = self.builder.get_object("EntreMedoc2").get_text()
cursor.execute(SQL ,(Val,) )
ClassATC = cursor.fetchone()
if cursor.rowcount<0:
self.builder.get_object("EntreClasseATC2").set_text("")
else:
self.ATC2.set_active(ClassATC[0] - 1)
def effacerinterface(self,widget):
dateBrut = datetime.datetime.now()
DateJour = FormatDate(dateBrut.day, dateBrut.month, dateBrut.year)
self.DateIP.set_text(DateJour)
self.builder.get_object("EntreService").set_text("")
self.NomPatient.set_text("")
self.PrenomPatient.set_text("")
self.Age.set_text("")
self.builder.get_object("EntreUA").set_text("")
self.builder.get_object("EntreSexe").set_text("")
self.Poids.set_text("")
self.builder.get_object("EntreProbleme").set_text("")
self.builder.get_object("EntreMedoc1").set_text("")
self.builder.get_object("EntreClasseATC1").set_text("")
self.builder.get_object("EntreMedoc2").set_text("")
self.builder.get_object("EntreClasseATC2").set_text("")
self.ProblemeDescription.set_text("")
self.builder.get_object("EntreIntervention").set_text("")
self.builder.get_object("EntreMedecin").set_text("")
self.builder.get_object("EntreContact").set_text("")
self.DateMedecin.set_text("")
self.builder.get_object("EntreDevenir").set_text("")
self.builder.get_object("EntreClinique").set_text("")
self.builder.get_object("EntreEconomique").set_text("")
self.builder.get_object("EntreOrga").set_text("")
if self.Conciliation.get_label() == "Oui":
self.Conciliation.activate()
def FermetureIP(self,widget):
Gtk.main_quit()
self.window.destroy()
def FormatDate(jour, mois, annee):
jour = str(jour)
mois = str(mois)
annee = str(annee)
if len(jour) < 2: jour = "0" + jour
if len(mois) < 2: mois = "0" + mois
return str(jour) + "/" + str(mois) + "/" + str(annee)
def appelAffichageAjoutIP(IDUtilisateurEnvoye):
global Idutilisateur
Idutilisateur = IDUtilisateurEnvoye
AffichageEcritureIP()
Gtk.main()
here the all project
Thank you for your futur answer

Hello I found the error
#on va creer l'autocomplete pour les medicament
self.liststoreMedoc = Gtk.ListStore(str)
for s in list(sum(self.ListeMedoc,())):
self.liststoreMedoc.append([s])
self.autocompletemedoc = Gtk.EntryCompletion()
self.autocompletemedoc.set_model(self.liststoreMedoc)
self.autocompletemedoc.set_text_column(0)
self.builder.get_object("EntreMedoc1").set_completion(self.autocompletemedoc)
self.builder.get_object("EntreMedoc2").set_completion(self.autocompletemedoc)
I used the same self.autocompletemedoc for the two entry.
I use the following algorithme in order to find the error :
1) removing the last function added
2) try the code
I correct the code with the folling
self.liststoreMedoc = Gtk.ListStore(str)
self.liststoreMedoc2 = Gtk.ListStore(str)
for s in list(sum(self.ListeMedoc,())):
self.liststoreMedoc.append([s])
self.liststoreMedoc2.append([s])
self.autocompletemedoc = Gtk.EntryCompletion()
self.autocompletemedoc2 = Gtk.EntryCompletion()
self.autocompletemedoc.set_model(self.liststoreMedoc)
self.autocompletemedo2c.set_model(self.liststoreMedoc2)
self.autocompletemedoc.set_text_column(0)
self.autocompletemedoc2.set_text_column(0)
self.builder.get_object("EntreMedoc1").set_completion(self.autocompletemedoc)
self.builder.get_object("EntreMedoc2").set_completion(self.autocompletemedoc2)
Now it's working and I can close my windows

Related

run task airflow all 1 mn

I have a problem.
I would like to start the code all minutes and print file in folder.
He doesn't run automatically. I don't undestand why, because i had schedule_interval. Can you help me ? Thank you for your help !
my_dag = DAG(
dag_id='eval_airflow',
schedule_interval='* * * * *',
default_args={
'owner': 'airflow',
'start_date': days_ago(0),
},
catchup=False
)
# définition de la fonction de récupération des données depuis OpenWeatherMap
def recup_data():
filepath = '/app/raw_files'
# création du dossier '/app/raw_files' de destination des fichiers résultats des requêtes
if os.path.exists(filepath) == False:
os.makedirs(filepath, mode = 511, exist_ok= True)
# positionnement dans le dossier '/app/raw_files'
os.chdir(filepath)
# création de la liste des villes pour lesquelles les données météo vont être demandées
villes = ["paris", "london","washington"]
cities = {}
for ville in villes:
r = requests.get(f"https://api.openweathermap.org/data/2.5/weather?q={ville}&appid={api}")
cities[ville] = r.json()
# obtenir l'heure et la date actuelles
now = datetime.datetime.now()
# créer un nom de fichier basé sur l'heure et la date
filename = f"{now.year}-{now.month}-{now.day} {now.hour}:{now.minute}.json"
# ouvrir le fichier en mode écriture
with open(filename, 'w') as file:
# # écrire les données au format JSON dans le fichier
json.dump(cities, file)
r.status_code
return r.status_code
#recup_data()
task1 = PythonOperator(
task_id='task1',
python_callable=recup_data,
dag=my_dag,
retry_delay=datetime.timedelta(seconds=30)
)
You need to hard code a start date. You have start_date=days_ago(0) you should have something like start_date=datetime(2021, 1, 1)

Adding an empty line when inserting a new item in a QTableWidget

I'm looking to update the display of my QTableWidget when I add a new item. But when adding, an empty line is added. The element that has been added is only visible on the next addition.
Before the first add : (Only the bottom QTableWidget is affected)
After the first add : (Only the bottom QTableWidget is affected)
After the second add : (Only the bottom QTableWidget is affected)
My update method : The affected table is situationBudgetsTab
def majBudget(self, nomBudget: QLineEdit, montantMax: QLineEdit):
self.budgetsTab.setRowCount(self.budgetsTab.rowCount() + 1)
self.situationBudgetsTab.setRowCount(self.situationBudgetsTab.rowCount() + 1)
# # ajout du budget dans le fichier Budget.txt
self.budgets.addBudgetInFile(nomBudget, montantMax)
# rangement des valeurs dans le tableau des situations
for k in range(len(self.dicoBudgets)):
nom = QTableWidgetItem(self.dicoBudgets[k][0])
# rangement de la valeur à la position courante
self.situationBudgetsTab.setItem(k, 0, nom)
# rangement du montantMax dans une chaine de caractères
s = str(self.dicoBudgets[k][1])
# on veut savoir à combien nous sommes de la limite de budget fixée
situation = QTableWidgetItem("0" + "/" + s[:-1].strip()) # stirp() supprime '\n' pour un affichage plus joli
# rangement de la valeur à la position courante
self.situationBudgetsTab.setItem(k, 1, situation)
# on place k à la dernière position du dictionnaire
k = len(self.dicoBudgets)-1
# ajout du dernier élément en sans le '\n'
nom = QTableWidgetItem(self.dicoBudgets[k][0])
self.situationBudgetsTab.setItem(k, 0, nom)
s = str(self.dicoBudgets[k][1])
situation = QTableWidgetItem("0" + "/" + s)
self.situationBudgetsTab.setItem(k, 1, situation)
# # mise à jour de l'affichage
self.printBudgetsTab()

How to split sentences without punctuation end in a review?

This the function I used But it does not take into consideration the case when the last sentences does not have punctuation mark.
texte = [ "Là où les vêtements de sport connectés actuels sont axés sur la performance des sportifs, ici, on aura l'occasion pour des amateurs de se rassurer que les mouvements que nous effectuons sont justes. Cela nous évitera bien des mauvaises surprises (douleurs et autres...) au lendemain d'une activité.","Par ailleurs, ce serais bien que l'application ne fonctionne pas uniquement avec les capteurs dans les vêtements, car on ne peut pas les porter tous les jours surtout s'il s'apparente à des vêtements de sport. Ainsi, il serait intéressant que l'application puisse quand même donner des conseils et astuces personnalisés sur nos postures même en dehors des activités sportives avec par exemple des conseils pour les personnes qui travaillent devant un écran toute la journée, ou encore pour ceux qui sont souvent en déplacement en voiture... Etc.", "Le système a l air bien mais cela consiste à avoir des bobines de fils spécial et il y a l air d y avoir beaucoup de petites pièce à sortir pour changer les bobines se qui risque d en perdre! Et je pense que si on met un exemple comme au début de la vidéo avec les 3 fils attachée à une gaine et que l on tir à l autre bout là malette sera trop légère et elle avancera et bloquera les fils ", " A voir les matériaux utilisés pour un prix plus précis"]
alphabet = "([a-z][...])"
alphabets= "([A-Za-z])"
min = "([...][a-z])"
maj = "([...][A-Z])"
punc = "([,':>><<)][A-Z])"
prefixes = "(Mr|St|Mrs|Ms|Dr)[.]"
suffixes = "(Inc|Ltd|Jr|Sr|Co)[.]"
starters = "(M|Mr|Mme|Sr|Dr)"
acronyms = "([A-Z][.][A-Z][.](?:[A-Z][.])?)"
websites = "[.](com|net|org|io|gov)"
digits = "([0-9])"
punct= "([!|)|?|,][<<|>>])"
def split_into_sentences(text):
#text = normalize(text)
text = " " + text + " "
text = text.replace("\n"," ")
text = re.sub(prefixes,"\\1<prd>",text)
text = re.sub(websites,"<prd>\\1",text)
if "Ph.D" in text: text = text.replace("Ph.D.","Ph<prd>D<prd>")
text = re.sub("\s" + alphabets + "[.] "," \\1<prd> ",text)
text = re.sub(acronyms+" "+starters,"\\1<stop> \\2",text)
text = re.sub(alphabets + "[.]" + alphabets + "[.]" + alphabets + "[.]","\\1<prd>\\2<prd>\\3<prd>",text)
text = re.sub(alphabets + "[.]" + alphabets + "[.]","\\1<prd>\\2<prd>",text)
text = re.sub(" "+suffixes+"[.] "+starters," \\1<stop> \\2",text)
text = re.sub(" "+suffixes+"[.]"," \\1<prd>",text)
text = re.sub(" " + alphabets + "[.]"," \\1<prd>",text)
text = re.sub(digits + "[.]" + digits,"\\1<prd>\\2",text)
text = re.sub(digits + "[.]" + digits,"\\1<prd>\\2",text)
text = re.sub(min,"\\1<prd>",text)
text = re.sub(maj,"\\1<stop>",text)
text = re.sub(punc,"\\1<prd>",text)
if "e.g." in text: text = text.replace("e.g.","e<prd>g<prd>")
if "i.e." in text: text = text.replace("i.e.","i<prd>e<prd>")
if "etc.)" in text: text = text.replace("etc.","etc<prd>)")
#if "Etc." in text: text = text.replace("Etc.","Etc<prd>")
if "...]" in text: text = text.replace("...]","<prd><prd><prd>]")
if "...]" in text: text = text.replace("...]","<prd><prd><prd>]")
if "...)'" in text: text = text.replace("...)","<prd><prd><prd>)")
if "?»." in text: text = text.replace("?».","<prd><prd>.")
if "!»." in text: text = text.replace("!».","<prd><prd>.")
if "]»." in text: text = text.replace("]».","<prd><prd>.")
#if "...." in text: text = text.replace("....","<prd><prd><prd><prd>")
if "..." in text: text = text.replace("...","<prd><prd><prd>")
if ".." in text: text = text.replace("..","<prd><prd>")
if "”" in text: text = text.replace(".”","”.")
if "\"" in text: text = text.replace(".\"","\".")
if "!" in text: text = text.replace("!\"","\"!")
if "?" in text: text = text.replace("?\"","\"?")
text = text.replace(".",".<stop>")
text = text.replace("?","?<stop>")
text = text.replace("!","!<stop>")
text = text.replace("...","...<stop>")
text = text.replace("<prd>",".")
# text = text.replace("....","....<stop>") #text = text.replace("…","…<stop>")
sentences = text.split("<stop>")
sentences = sentences[:-1]
sentences = [s.strip() for s in sentences]
#print(sentences)
return sentences
list_clean_text = []
length_token = []
length_Berttoken = []
length_sent = []
list_sent =[]
list_clean = []
print(type(texte))
for i, elt in enumerate(texte):
#print(i, "--", elt)
# split sentences and append len for each
split_sent = split_into_sentences(elt)
print(type(split_sent))
if split_sent == []:
print("List is empty")
list_sent.append(elt)
nb = 1
length_sent.append(nb)
else:
list_sent.append(split_sent)
length_sent.append(len(split_sent))
The above function function work well but it does not take into consideration when a string does not have punctuation or when the last sentence of a string does not have punction. It ignores and just return the sentences where the end was a punctuation.
It's easier with nltk as suggested by #TimBiegeleisen. However, you have to prepare the framework first:
# Python env: pip install nltk
# Anaconda env: conda install nltk
from nltk.tokenize import sent_tokenize
nltk.download('punkt')
tokenizer = nltk.data.load('tokenizers/punkt/french.pickle')
out = tokenizer.tokenize_sents(texte))
Output:
>>> out
[["Là où les vêtements de sport connectés actuels sont axés sur la performance des sportifs, ici, on aura l'occasion pour des amateurs de se rassurer que les mouvements que nous effectuons sont justes.",
"Cela nous évitera bien des mauvaises surprises (douleurs et autres...) au lendemain d'une activité."],
["Par ailleurs, ce serais bien que l'application ne fonctionne pas uniquement avec les capteurs dans les vêtements, car on ne peut pas les porter tous les jours surtout s'il s'apparente à des vêtements de sport.",
"Ainsi, il serait intéressant que l'application puisse quand même donner des conseils et astuces personnalisés sur nos postures même en dehors des activités sportives avec par exemple des conseils pour les personnes qui travaillent devant un écran toute la journée, ou encore pour ceux qui sont souvent en déplacement en voiture...",
'Etc.'],
['Le système a l air bien mais cela consiste à avoir des bobines de fils spécial et il y a l air d y avoir beaucoup de petites pièce à sortir pour changer les bobines se qui risque d en perdre!',
'Et je pense que si on met un exemple comme au début de la vidéo avec les 3 fils attachée à une gaine et que l on tir à l autre bout là malette sera trop légère et elle avancera et bloquera les fils'],
[' A voir les matériaux utilisés pour un prix plus précis']]
Where you set you sentence here:
sentences = text.split("<stop>")
There is no stop case for non-punctuation as you mentioned.
Perhaps a check for stop in the sentence first else fallback to the whole sentence.
in oneline:
sentences = text.split("<stop>") if "<stop>" in text else [text]

Find exact string in file works weird

I need to find a string in a text file (here a dictionary).
The string found in the file must be exactly the same as the one I am comparing.
Here is my code and the dictionary:
the code
#!/usr/bin/env python3
import os # pour ouvrir le dictionnaire
def check_if_exist(word,dico):
"""retourne vrai si le mot exsite dans le dictionnaire"""
for line in dico:
#line = line.rstrip('\n')
# on ne peut pas utiliser in pour la condition
# car in fait une comparaison partielle, exemple :
# "pal" in "empaler" ; return True
if word.rstrip('\n') == line.rstrip('\n'):
return True
return False
if __name__ == "__main__":
#file_path = "./dico-french.txt"
file_path = "./dico.txt"
# teste si le fichier existe
if(not os.path.isfile(file_path)):
print("le dictionnaire n'existe pas")
exit(1)
#ouvre le dictionnaire
dico = open(file_path,'r')
print("q pour quitter le jeu.")
mot = input("Premier joueur, quel est votre mot ? ")
# tant que le mot n'existe pas
while(not check_if_exist(mot,dico)):
mot = input("Un autre ? ")
# le mot existe, on passe au joueur suivant
tab = []
tab.append(mot)
mot_old = mot
while mot!='q':
print("\nles mots sont ",tab)
mot = input("Joueur suivant, quel est votre mot ? ")
while(not check_if_exist(mot,dico)):
mot = input("Un autre bis ? ")
tab.append(mot)
mot_old = mot
print("Bye.")
the dict
pal
lape
pale
palie
pallier
pallies
Let me explain you the problem with these examples :
for the fig n°1, the conditions seems to be met, all the words are in the dictionary.
fig n°1:
q pour quitter le jeu.
Premier joueur, quel est votre mot ? pal
les mots sont ['pal']
Joueur suivant, quel est votre mot ? pale
les mots sont ['pal', 'pale']
Joueur suivant, quel est votre mot ? palie
les mots sont ['pal', 'pale', 'palie']
Joueur suivant, quel est votre mot ? ^C
for the fig n°2, all the word are in the dictionary, but when I enter a word positioned after the one I am comparing in the dictionary, it does not find it
fig n°2:
q pour quitter le jeu.
Premier joueur, quel est votre mot ? palie
les mots sont ['palie']
Joueur suivant, quel est votre mot ? pal
Un autre bis ? ^C
There is some kind of index that doesn't reset while I leave the function.
On the fig n°3 I try with a word not in the dictionary, this unknown word is not found, so it ask me for another word, and when I enter a known-word it doesn't work.
fig n°3:
q pour quitter le jeu.
Premier joueur, quel est votre mot ? pal
les mots sont ['pal']
Joueur suivant, quel est votre mot ? hgjfdkjhgfj
Un autre bis ? pale
Un autre bis ? ^C
Can someone explain this to me?
EDIT:
Thanks to 'Nir H.', just have to add dico.seek(0) at the beginning of my function

discord bot youtube url python

I've made a bot that can play audio through discord but what i want to do now is to make him to say the url in the chat.
#bot.command(pass_context = True)
async def play(ctx,*,query : str):
opts = {'default_search': 'auto','quiet': True,} #options pour youtube-dl que je comprends pas
if voice == None: #si le bot n'a pas encore été connecté à un channel
await bot.say('Summon me in your channel first (!summon)')
elif query[:3] == 'url':
try:
n = int(query[4])
await bot.say(videos[n][0])
except Exception as e:
await bot.say (e)
elif len(query) != 1: #si le joueur essaie de taper !play recherche et non !play 1/2/3/4
videos = yt.recherche(query,4) #on charge les informations des vidéos avec le module yt
for i in range(4): #on affiche les 4 résultas avec un emebed contenant un apercu de chaque vidéo
em = discord.Embed(title=videos[i][1], colour=0xff0000, type = 'rich')
em.set_thumbnail(url='https://i.ytimg.com/vi/'+videos[i][0][32:]+'/hqdefault.jpg?sqp=-oaymwEXCNACELwBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDBtpHoodvOvDCPjzg9t7PzSljI3A')
await bot.send_message(ctx.message.channel,None,embed=em)
await bot.say('Make your choice! (!play 1/2/3/4)')
else: #si le joueur essaie de choisir une video avec !play 1/2/3/4
try:
if player != None: #si le bot joue déjà une chanson, on stoppe la précédente avant de commencer la suivante (sinon ca plante)
player.stop()
query = int(query) #on convertit en entier : str -> int
player = await voice.create_ytdl_player(videos[query-1][0],ytdl_options=opts) #on initialise le player audio dans la varialble globale
player.volume = 0.2 #on fixe le volume
player.start() #on démarre la lecture
except Exception as e: #exception atteinte en général si on a pas réussi à faire query = int(query), c'est à dire que le joueur à fait une faute de frappe
await bot.say(e)
my problem is when i want to change the elif query:3 to something else to shorter the "url" i wanted to put like .play -u .... but i can't make it work
import requests #librairie de base permettant d'ouvrir une page web dans la console en gros
def recherche(query,nb):
query = query.replace(' ','+')
url = 'https://www.youtube.com/results?search_query='+query
r = requests.get(url).text
balise = 'data-context-item-id="' #balise signalant l'élément manquant dans le code source
liste_videos = []
for e in range(nb): #on ajoute les url de chaque video
liste_videos.append([])
i = r.index(balise) #renvoie la position de la balise dans le code
liste_videos[-1].append('https://www.youtube.com/watch?v='+r[i+22:i+22+11])
r = r[i+100:] #on coupe le début du code pour aller chercher dans la suite plus facilement
for vid in range(nb): #puis leurs titre
url = liste_videos[vid][0] #on prend l'url d'une video
r = requests.get(url).text #on ouvre la page correspondante
title = r[r.index('<title>')+7:r.index('</title>')] #et on cherche le titre dedans
liste_videos[vid].append(title) #puis on met le titre dans le tableau video
u = liste_videos[vid][0]
return liste_videos #on finit par renvoyer ce tableau
hacky: suppose you call the bot with "play u1"
elif query[0] == 'u':
try:
n = int(query[1])
await bot.say(videos[n][0])
essentially query is string which can be accesd like a list. Have a look here:
How to get char from string by index?

Categories

Resources