Demande d'aide Tkinter

Vous souhaitez piloter votre framboise à partir d'une page web ? Ou mieux encore à partir d'un smartphone ou d'une tablette Android ? Venez donc visiter cette rubrique...

Modérateur : Francois

Répondre
Le_Marius
Messages : 39
Enregistré le : jeu. 14 avr. 2016 15:37

Demande d'aide Tkinter

Message par Le_Marius » mar. 10 mai 2016 13:19

bonjour,
Est-il possible d'afficher en permanence dans un scrolledtext un fichier .txt daté ?
connaissez-vous un moyen pour faire un rafraichissement des données reçues sur ce fichier toutes les X secondes ?

Avatar du membre
Manfraid
Modérateur
Messages : 1353
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Demande d'aide Tkinter

Message par Manfraid » mar. 10 mai 2016 13:27

Salut,

normalement je pense que c'est possible, mais il faudrait que je vois ton code pour mieux t’aiguiller
NAS : DIY OS Debian: DD250Go + 3x2To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

Le_Marius
Messages : 39
Enregistré le : jeu. 14 avr. 2016 15:37

Re: Demande d'aide Tkinter

Message par Le_Marius » mar. 10 mai 2016 14:28

Code : Tout sélectionner

# !/usr/bin/python3
# -*- coding: utf8 -*-

import os
import glob
from tkinter import *
from tkinter.scrolledtext import ScrolledText
from tkinter import filedialog
#____________________________________________________________________________
#____________________________________________________________________________

#                         zone de définition de fonctions
#____________________________________________________________________________
#____________________________________________________________________________



#__________________________________choisir_dossier____________________________
def choisir_dossier ():
    "ouvre un dialogue de sélection de répertoire"
    # voir http://tkinter.unpythonic.net/wiki/tkFileDialog
    dossier = filedialog.askdirectory(
        title="Sélectionnez le dossier de stockage",
        mustexist=True,
        parent=fenetre,
    )
    # un dossier a vraiment été sélectionné ?
    if dossier:
        # on remplit la liste de fichiers
        remplir_liste(dossier)
    # end if
# end def



#_________________________________remplir_liste_______________________________
def remplir_liste (dossier):
    """
        remplit la liste de fichiers à partir de l'emplacement
        @dossier fourni en paramètre de fonction;
    """
    # init globales
    global dossier_actuel
    # on conserve le dossier en cours de traitement
    dossier_actuel = dossier
    # on récupère la liste des fichiers
    _liste_fichiers = glob.glob(normaliser(dossier, motif_fichiers))
    # on met à jour la listbox à travers la variable de contrôle
    cvar_fichiers.set(" ".join(map(os.path.basename, _liste_fichiers)))
# end def



#__________________________________normaliser_________________________________
def normaliser (chemin, *args):
    "met un chemin de fichier en conformité avec l'OS utilisé"
    return os.path.normpath(os.path.join(chemin, *args))
# end def



#______________________________Afficher fichier______________________________
def afficher_fichier (event):
    "affiche le contenu du fichier sélectionné"
    # on récupère le nom du fichier
    fichier = normaliser(
        dossier_actuel,
        liste_fichiers.get(liste_fichiers.curselection() or 0)
    )
    # est-ce réellement un fichier ?
    if os.path.isfile(fichier):
        # oui, on peut l'ouvrir
        with open(fichier) as file_in:
            # on efface d'abord la zone de texte
            affichage_texte.delete("1.0", END)
            # on insère le nouveau contenu texte du fichier
            affichage_texte.insert("1.0", file_in.read())
        # end with
    # end if
# end def
#____________________________________________________________________________




#______________________________Afficher fichier Journalier______________________________
def aff_fich_Jr (event):
    "affiche le contenu du fichier journalier"
    # on récupère le nom du fichier
    fichier = open("/home/pi/Desktop/buffer")
    
    # est-ce réellement un fichier ?
    if os.path.isfile(fichier):
        # oui, on peut l'ouvrir
        with open(fichier) as file_in:
            # on efface d'abord la zone de texte
            affichage_texte_Fil.delete("1.0", END)
            # on insère le nouveau contenu texte du fichier
            affichage_texte_Fil.insert("1.0", file_in.read())
        # end with
    # end if
# end def
#____________________________________________________________________________










#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

#_________________________________________________________________________________
#_________________________________________________________________________________

#                              début du programme                                 
#_________________________________________________________________________________
#_________________________________________________________________________________





#____________________________________ init variables globales_____________________
dossier_actuel = ""
motif_fichiers = "*" #.txt


# on commence par établir l'interface graphique (GUI)





#______________________________création fenêtre principale________________________

fenetre = Tk()
fenetre.title("Lecture de l'Historique")
# SVP, NE FORCEZ PAS LA GÉOMÉTRIE de la fenêtre /!\
# elle va s'adapter toute seule...
fenetre.geometry("800x480")




#xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
#                           partie selection de dossier
#xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

#____________________________ création conteneur pour la gestion des fichiers_____


conteneur_fichiers = Frame(fenetre)


# on crée une étiquette texte dans ce conteneur                  
Label(
    conteneur_fichiers,
    text="Veuillez sélectionner un fichier :",
).grid(row=0, column=0, sticky=EW)



#on place le conteneur                                           ROW =0  COLUMN =  0


# on rend le conteneur redimensionnable
conteneur_fichiers.columnconfigure(0, weight=1)
conteneur_fichiers.rowconfigure(1, weight=1)



#______________________________ création liste des fichiers_______________________

cvar_fichiers = StringVar()
liste_fichiers = Listbox(
    conteneur_fichiers,
    fg="black",
    font="sans 10 bold",
    listvariable=cvar_fichiers,
    height=20,
    width=20,
    )

    
#on place la liste de fichier                                     ROW =1  COLUMN =  0
liste_fichiers.grid(row=1, column=0, sticky=NS+EW)


#______________________________________ scrollbar_________________________________

vbar_fichiers = Scrollbar(conteneur_fichiers, orient=VERTICAL)
vbar_fichiers.grid(row=1, column=1, sticky=NS+W)               #  ROW = 1  COLUMN = 1  

#____________________connexion scrollbar à la liste des fichiers__________________

liste_fichiers.configure(yscrollcommand=vbar_fichiers.set)
vbar_fichiers.configure(command=liste_fichiers.yview)
# on va gérer l'affichage des recettes sur simple clic
# sur un fichier de la liste
liste_fichiers.bind("<ButtonRelease-1>", afficher_fichier)


#___________________________création du bouton 'Parcourir'_______________________

Button(
    conteneur_fichiers,
    text="Sélectionner un dossier",
    command=choisir_dossier,
).grid(row=2, column=0)                                        #  ROW =2  COLUMN = 0

#xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx




#ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
#                               partie affichage de l'historique
#ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo


#______________________création du conteneur pour l'affichage____________________

conteneur_affichage = Frame(fenetre)

conteneur_fichiers.grid(row=0, column=0, sticky=NS+EW, padx=5, pady=5)
# on place le conteneur dans la fenêtre principale              #  ROW =0  COLUMN = 0
# avec des marges padx et pady

                                                               

# on rend le conteneur redimensionnable
conteneur_affichage.columnconfigure(0, weight=1)
conteneur_affichage.rowconfigure(1, weight=1)



#___________________création étiquette texte dans ce conteneur__________________
Label(
    conteneur_affichage,
    text="historique :"
).grid(row=0, column=0, sticky=EW)                              #  ROW =0  COLUMN = 0


#______________________création zone d'affichage de texte_______________________

affichage_texte = ScrolledText(
    conteneur_affichage,
    bg="white",
    fg="blue",
    font="sans 8 bold",
    height=20,
    width=45,
)
affichage_texte.grid(row=1, column=0, sticky=NS+EW)             #  ROW = 1 COLUMN = 0


"""bloquer la modification de texte"""
#affichage_texte.config(state='readonly')


#______________________création bouton Transfert________________________________
Button(
    conteneur_affichage,
    text="Transfert"
    ).grid(row=2, column=0,sticky=E)


#oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo





















#....................................................................................
#                               PARTIE AFFICHAGE FIL DE L'EAU
#....................................................................................


#______________________création du conteneur pour l'affichage____________________

conteneur_affichage_Fil = Frame(fenetre)

conteneur_affichage_Fil.grid(row=0, column=1, sticky=NS+EW, padx=5, pady=5)
# on place le conteneur dans la fenêtre principale              #  ROW =0  COLUMN = 0
# avec des marges padx et pady

                                                               

# on rend le conteneur redimensionnable
conteneur_affichage_Fil.columnconfigure(0, weight=1)
conteneur_affichage_Fil.rowconfigure(1, weight=1)



#___________________création étiquette texte dans ce conteneur__________________
Label(
    conteneur_affichage_Fil,
    text="fil de l'eau :"
    ).grid(row=0, column=1, sticky=EW)                              #  ROW =0  COLUMN = 0


#______________________création zone d'affichage de texte_______________________

affichage_texte_Fil = ScrolledText(
    conteneur_affichage_Fil,
    bg="white",
    fg="blue",
    font="sans 8 bold",
    height=20,
    width=45,
)

 
affichage_texte_Fil.grid(row=1, column=1, sticky=NS+EW)        #  ROW = 1 COLUMN = 0


#______________________création bouton OK_______________________________________
Button(
    conteneur_affichage_Fil,
    text="Validation de la saisie"
    ).grid(row=2, column=1,sticky=E)
#_____________________création de la zone de saisie des commandes_______________
#Texte1
salut = StringVar()
Entry(conteneur_affichage_Fil,
      textvariable=salut,
      font="sans 10 bold",
      ).grid(row=2, column=1,sticky=W)

#.....................................................................................









"""
#__________________________________ bouton 'quitter'____________________________
Button(
    conteneur_affichage,
    text="Quitter",
    command=fenetre.destroy
).grid(row=2, column=0, sticky=E)                               #  ROW =  COLUMN = 0
"""
# on place le conteneur dans la fenêtre principale
# avec des marges padx et pady
conteneur_affichage.grid(row=1, column=0, sticky=NS+EW, padx=5, pady=5)



# on rend la fenêtre redimensionnable
fenetre.rowconfigure(0, weight=1)
fenetre.columnconfigure(1, weight=1)

#_____________________________________________________________________________________
#_____________________________________________________________________________________




#pour demarer avec un dossier par défaut,
remplir_liste(r"/media/pi/USB2")

# pour finir
# on lance la boucle événementielle principale
fenetre.mainloop()
voici le programme en entier afin de pouvoir voir le fonctionnement global.
Pour la partie affichage fil de l'eau je n'ai pas grand chose.
L'objectif est de lire chaque jour le fichier journalier qui est rafraichi toutes les X secondes

Le_Marius
Messages : 39
Enregistré le : jeu. 14 avr. 2016 15:37

Re: Demande d'aide Tkinter

Message par Le_Marius » mar. 10 mai 2016 14:37

J'ai aussi une question concernant la zone de texte et le bouton de validation qui se trouve à côté .
Le but c'est que l'utilisateur puisse saisir par exemple "DA,SE" et que lorsqu'on appui sur le bouton de Validation,
les caractères saisis soient inséré dans un script à coté .

Code : Tout sélectionner

from tkinter import *
import subprocess,os
import threading,time


main = Tk()
main.geometry("500x400+300+400")
main.title('test debutant 2')

def OKLM():
        os.system("./envoi2.sh Toto")
   
"""ici je cherche à lancer envoi.sh avec comme paramètre de texte les données
contenues dans Toto l'objectif est de placer dans envoi2.sh ce qui a été saisi au
 clavier dans la zone de texte de l'IHM """

Toto = StringVar()
#Texte1

texte = Entry(main, textvariable = Toto).pack()

Button(main ,text = "push me !", command = OKLM ).pack()


Le_Marius
Messages : 39
Enregistré le : jeu. 14 avr. 2016 15:37

Re: Demande d'aide Tkinter

Message par Le_Marius » mer. 11 mai 2016 13:42

Problème résolu pour l'envoi de commande.
Par contre, je suis toujours bloqué pour la lecture au fil de l'eau

Répondre

Retourner vers « Des interfaces pour le Raspberry Pi »