Python Forum
[Tkinter] update the content of Text widget - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: GUI (https://python-forum.io/forum-10.html)
+--- Thread: [Tkinter] update the content of Text widget (/thread-14204.html)

Pages: 1 2


update the content of Text widget - atlass218 - Nov-19-2018

hi
I try to update the content of Text widget by using this fonction:
def affichage_ddm_axe_loc35R_update ():

	with open('archives/ILS_35R/loc35R/releves_mesure_loc35R/ddm_axe_loc35R/ddm_axe_monitor1_loc35R.txt') as ddm_axe_monitor1, open('archives/ILS_35R/loc35R/releves_mesure_loc35R/ddm_axe_loc35R/ddm_axe_monitor2_loc35R.txt') as ddm_axe_monitor2:
		
		s_generalites_bottom_axe_loc35R= Scrollbar(generalites_bottom)
		T_generalites_bottom_axe_loc35R= Text(generalites_bottom,bg='powder blue',width=450,height=350,font=('arial',14,'bold'))
	  
		s_generalites_bottom_axe_loc35R.pack(side=RIGHT, fill=Y)
		T_generalites_bottom_axe_loc35R.pack(side=LEFT, fill=Y)
		s_generalites_bottom_axe_loc35R.config(command=T_generalites_bottom_axe_loc35R.yview)
		T_generalites_bottom_axe_loc35R.config(yscrollcommand=s_generalites_bottom_axe_loc35R.set)
		while True:
			line1 = ddm_axe_monitor1.readline()
			if len(line1) == 0:
				break
			line1 = line1.strip().split()
			line2 = ddm_axe_monitor2.readline()
			line2 = line2.strip().split()
			T_generalites_bottom_axe_loc35R.insert(END, f'{line1[0]:15}\t {line1[1]:10}\t\t {line2[1]:10}\n')
T_generalites_bottom_axe_loc35R.after(1000, update) 
the above python code is inspired from the following code :
def update():
    with open("htfl.txt","r") as f:
        data = f.read()
        T.insert(END,data)
    T.after(1000, update)
the update of the content of the Text was actually done but only once time and not in a continuous and multiple times
can you help me please


RE: update the content of Text widget - woooee - Nov-19-2018

Quote:the update of the content of the Text was actually done but only once time and not in a continuous and multiple times
Your after() calls a function named update (and it is only called once). Please post your update() function

T_generalites_bottom_axe_loc35R.after(1000, update) 



RE: update the content of Text widget - atlass218 - Nov-20-2018

sorry I rectfie the function code

def affichage_ddm_axe_loc35R_update ():

	with open('archives/ILS_35R/loc35R/releves_mesure_loc35R/ddm_axe_loc35R/ddm_axe_monitor1_loc35R.txt') as ddm_axe_monitor1, open('archives/ILS_35R/loc35R/releves_mesure_loc35R/ddm_axe_loc35R/ddm_axe_monitor2_loc35R.txt') as ddm_axe_monitor2:
		
		s_generalites_bottom_axe_loc35R= Scrollbar(generalites_bottom)
		T_generalites_bottom_axe_loc35R= Text(generalites_bottom,bg='powder blue',width=450,height=350,font=('arial',14,'bold'))
	  
		s_generalites_bottom_axe_loc35R.pack(side=RIGHT, fill=Y)
		T_generalites_bottom_axe_loc35R.pack(side=LEFT, fill=Y)
		s_generalites_bottom_axe_loc35R.config(command=T_generalites_bottom_axe_loc35R.yview)
		T_generalites_bottom_axe_loc35R.config(yscrollcommand=s_generalites_bottom_axe_loc35R.set)
		while True:
			line1 = ddm_axe_monitor1.readline()
			if len(line1) == 0:
				break
			line1 = line1.strip().split()
			line2 = ddm_axe_monitor2.readline()
			line2 = line2.strip().split()
			T_generalites_bottom_axe_loc35R.insert(END, f'{line1[0]:15}\t {line1[1]:10}\t\t {line2[1]:10}\n')

    T_generalites_bottom_axe_loc35R.after(1000, affichage_ddm_axe_loc35R_update)
and there is the code to call function and update mode :

affichage_ddm_axe_loc35R_update ()

 



RE: update the content of Text widget - atlass218 - Nov-23-2018

up
need help to resolve this problem
thanks


RE: update the content of Text widget - atlass218 - Nov-26-2018

there is the detailed code :
from tkinter import *
from tkinter.ttk import Notebook
import tkinter.ttk as ttk
import time

#window
root=Tk()
root.geometry('450x350')
root.title('test')

#variables
ent_releves1=StringVar()
ent_releves2=StringVar()

#Functions:
def archiver():
	
	archive_monitoring={"date" : time.strftime('%d/%m/%y', time.localtime()),	
				  "releves_mesure1": ent_releves1.get(),
                  "releves_mesure2": ent_releves2.get(),  				          }	
	
	if (ent_releves1.get() !="" ) :	
		mon_fichier1 = open("save/monitor1.txt", "r")
		text1 = mon_fichier1.read()
		mon_fichier1.close()						
		textInsert1=str(archive_monitoring["date"])+"\t" +str(archive_monitoring["releves_mesure1"])+"\n"
		fileW1 = open("save/monitor1.txt", "w")
		fileW1.write(textInsert1 + text1)
		fileW1.close()
	
	if (ent_releves2.get() !="" ) :	
		mon_fichier2 = open("save/monitor2.txt", "r")
		text2 = mon_fichier2.read()
		mon_fichier2.close()						
		textInsert2=str(archive_monitoring["date"])+"\t" +str(archive_monitoring["releves_mesure2"])+"\n"
		fileW2 = open("save/monitor2.txt", "w")
		fileW2.write(textInsert2 + text2)
		fileW2.close()

def affichage_update ():

	with open('save/monitor1.txt',"r") as monitor1, open('save/monitor2.txt',"r") as monitor2:
		
		s= Scrollbar(releves)
		T= Text(releves,bg='powder blue',width=450,height=350,font=('arial',14,'bold'),pady=25)
	  
		s.pack(side=RIGHT, fill=Y)
		T.pack(side=LEFT, fill=Y)
		s.config(command=T.yview)
		T.config(yscrollcommand=s.set)
		
		while True:
			line1 = monitor1.readline()
			if len(line1) == 0:
				break
			line1 = line1.strip().split()
			line2 = monitor2.readline()
			line2 = line2.strip().split()
			T.insert(END, f'{line1[0]:15}\t {line1[1]:10}\t\t {line2[1]:10}\n')
	T.update_idletasks()
			

	T.after(500,affichage_update)	


container=ttk.Notebook(root,width=450,height=350)

monitoring=Frame(container,bg='powder blue')
container.add(monitoring,text='monitor data')

releves=Frame(container,bg='powder blue')
container.add(releves,text='releves')

lbf1 = LabelFrame(monitoring, text="Lecture Monitor 1",padx=10, pady=10)
lbf1.pack(side=LEFT,padx=10, pady=10,anchor=NE)

entry_lbf1= Entry(lbf1,textvariable=ent_releves1)
entry_lbf1.pack(pady=5)

lbf2 = LabelFrame(monitoring, text="Lecture Monitor 2",padx=10, pady=10)
lbf2.pack(side=LEFT,padx=10, pady=10,anchor=NW)

entry_lbf2= Entry(lbf2,textvariable=ent_releves2)
entry_lbf2.pack(pady=5)


bt_archiver=Button(monitoring,text='Archiver',command=archiver)
bt_archiver.place(x=40,y=120)


generalites_top=Frame(releves,bg='powder blue',width=450)
generalites_top.pack(side=TOP,fill=X)

generalites_bottom=Frame(releves,bg='powder blue')
generalites_bottom.pack(side=BOTTOM)

head_axe_loc35L = ['Date', 'Monitor 1', 'Monitor 2']

lb_date=Label(generalites_top,text=f'{head_axe_loc35L[0]:15}',bg='powder blue',font=('arial',12,'bold'))
lb_date.pack(side=LEFT,padx=5,anchor=NW)

lb_monitor1=Label(generalites_top,text=f'{head_axe_loc35L[1]:10}',bg='powder blue',font=('arial',12,'bold'))
lb_monitor1.pack( side=LEFT)

lb_monitor2=Label(generalites_top,text=f'{head_axe_loc35L[2]:10}',bg='powder blue',font=('arial',12,'bold'))
lb_monitor2.pack(padx=70, side=LEFT)



with open('save/monitor1.txt',"r") as monitor1, open('save/monitor2.txt',"r") as monitor2:
		
	s= Scrollbar(releves)
	T= Text(releves,bg='powder blue',width=450,height=350,font=('arial',14,'bold'),pady=25)
	  
	s.pack(side=RIGHT, fill=Y)
	T.pack(side=LEFT, fill=Y)
	s.config(command=T.yview)
	T.config(yscrollcommand=s.set)
		
	while True:
		line1 = monitor1.readline()
		if len(line1) == 0:
			break
		line1 = line1.strip().split()
		line2 = monitor2.readline()
		line2 = line2.strip().split()
		T.insert(END, f'{line1[0]:15}\t {line1[1]:10}\t\t {line2[1]:10}\n')

T.update_idletasks()
			
T.after(500,affichage_update)	

container.pack(expand=1, fill='both', padx=5, pady=5)

root.mainloop()
thanks for help


RE: update the content of Text widget - jfong - Nov-27-2018

It's not a good idea repeatedly create widget s and T in the affichage_update(). I don't know what it will cause but remove them (line 44~50) out can solve the update problem.


RE: update the content of Text widget - atlass218 - Nov-27-2018

I remove lines 44 to 50 but the problem of the update is not solved


RE: update the content of Text widget - jfong - Nov-27-2018

This one works for me on Windows Vista, Python 3.4
from tkinter import *
from tkinter.ttk import Notebook
import tkinter.ttk as ttk
import time
 
#window
root=Tk()
root.geometry('450x350')
root.title('test')
 
#variables
ent_releves1=StringVar()
ent_releves2=StringVar()
 
file1 = 'temp1.txt'
file2 = 'temp2.txt'
#Functions:
def archiver():
    archive_monitoring={"date" : time.strftime('%d/%m/%y', time.localtime()),   
                  "releves_mesure1": ent_releves1.get(),
                  "releves_mesure2": ent_releves2.get(),                          } 
     
    if (ent_releves1.get() !="" ) : 
        mon_fichier1 = open(file1, "r")
        text1 = mon_fichier1.read()
        mon_fichier1.close()                        
        textInsert1=str(archive_monitoring["date"])+"\t" +str(archive_monitoring["releves_mesure1"])+"\n"
        fileW1 = open(file1, "w")
        fileW1.write(textInsert1 + text1)
        fileW1.close()
     
    if (ent_releves2.get() !="" ) : 
        mon_fichier2 = open(file2, "r")
        text2 = mon_fichier2.read()
        mon_fichier2.close()                        
        textInsert2=str(archive_monitoring["date"])+"\t" +str(archive_monitoring["releves_mesure2"])+"\n"
        fileW2 = open(file2, "w")
        fileW2.write(textInsert2 + text2)
        fileW2.close()

container=ttk.Notebook(root,width=450,height=350)
 
monitoring=Frame(container,bg='powder blue')
container.add(monitoring,text='monitor data')
 
releves=Frame(container,bg='powder blue')
container.add(releves,text='releves')

s= Scrollbar(releves)
T= Text(releves,bg='powder blue',width=450,height=350,font=('arial',14,'bold'),pady=25)

s.pack(side=RIGHT, fill=Y)
T.pack(side=LEFT, fill=Y)
s.config(command=T.yview)
T.config(yscrollcommand=s.set)

def affichage_update():
    with open(file1,"r") as monitor1, open(file2,"r") as monitor2:
        T.delete('1.0', 'end')
        while True:
            line1 = monitor1.readline()
            if len(line1) == 0:
                break
            line1 = line1.strip().split()
            line2 = monitor2.readline()
            line2 = line2.strip().split()
            #T.insert(END, f'{line1[0]:15}\t {line1[1]:10}\t\t {line2[1]:10}\n')
            T.insert(END, '{:15}\t {:10}\t\t {:10}\n'.format(line1[0], line1[1], line2[1]))
    #T.update_idletasks()
    T.after(500,affichage_update)   
 
  
lbf1 = LabelFrame(monitoring, text="Lecture Monitor 1",padx=10, pady=10)
lbf1.pack(side=LEFT,padx=10, pady=10,anchor=NE)
 
entry_lbf1= Entry(lbf1,textvariable=ent_releves1)
entry_lbf1.pack(pady=5)
 
lbf2 = LabelFrame(monitoring, text="Lecture Monitor 2",padx=10, pady=10)
lbf2.pack(side=LEFT,padx=10, pady=10,anchor=NW)
 
entry_lbf2= Entry(lbf2,textvariable=ent_releves2)
entry_lbf2.pack(pady=5)
 
bt_archiver=Button(monitoring,text='Archiver',command=archiver)
bt_archiver.place(x=40,y=120)
 
generalites_top=Frame(releves,bg='powder blue',width=450)
generalites_top.pack(side=TOP,fill=X)
 
generalites_bottom=Frame(releves,bg='powder blue')
generalites_bottom.pack(side=BOTTOM)
 
head_axe_loc35L = ['Date', 'Monitor 1', 'Monitor 2']
 
#lb_date=Label(generalites_top,text=f'{head_axe_loc35L[0]:15}',bg='powder blue',font=('arial',12,'bold'))
lb_date=Label(generalites_top,text='{:15}'.format(head_axe_loc35L[0]),bg='powder blue',font=('arial',12,'bold'))
lb_date.pack(side=LEFT,padx=5,anchor=NW)
 
#lb_monitor1=Label(generalites_top,text=f'{head_axe_loc35L[1]:10}',bg='powder blue',font=('arial',12,'bold'))
lb_monitor1=Label(generalites_top,text='{:10}'.format(head_axe_loc35L[1]),bg='powder blue',font=('arial',12,'bold'))
lb_monitor1.pack( side=LEFT)
 
#lb_monitor2=Label(generalites_top,text=f'{head_axe_loc35L[2]:10}',bg='powder blue',font=('arial',12,'bold'))
lb_monitor2=Label(generalites_top,text='{:10}'.format(head_axe_loc35L[2]), bg='powder blue',font=('arial',12,'bold'))
lb_monitor2.pack(padx=70, side=LEFT)

affichage_update()
container.pack(expand=1, fill='both', padx=5, pady=5)
 
root.mainloop()
Replace file1 and file2 with your own


RE: update the content of Text widget - atlass218 - Nov-27-2018

I test the code with my personnel files it's OK but the head is not shown at the top
the code of the head is :

head_axe_loc35L = ['Date', 'Monitor 1', 'Monitor 2']

lb_date=Label(generalites_top,text='{:15}'.format(head_axe_loc35L[0]),bg='powder blue',font=('arial',12,'bold'))
lb_date.pack(side=LEFT,padx=5,anchor=NW)
  
lb_monitor1=Label(generalites_top,text='{:10}'.format(head_axe_loc35L[1]),bg='powder blue',font=('arial',12,'bold'))
lb_monitor1.pack( side=LEFT)
  
lb_monitor2=Label(generalites_top,text='{:10}'.format(head_axe_loc35L[2]), bg='powder blue',font=('arial',12,'bold'))
lb_monitor2.pack(padx=70, side=LEFT)
I check some possibilities but it doesn't appear, I don't knew why?


RE: update the content of Text widget - jfong - Nov-28-2018

The pack manager is a sequence-related procedure, which means first packed widget always located first. Also, during the debugging, use different background color may help on finding the problem.

Because of the continuously update of the whole text region, the Scrollbar becomes useless. You may consider move it into archiver().
container=ttk.Notebook(root,width=450,height=350)
 
monitoring=Frame(container,bg='yellow')
container.add(monitoring,text='monitor data')
 
releves=Frame(container,bg='blue')
container.add(releves,text='releves')

generalites_top=Frame(releves,bg='red')
generalites_top.pack(side=TOP, fill=X)

s= Scrollbar(releves)
s.pack(side=RIGHT, fill=Y)
T= Text(releves, bg='yellow', font=('arial',14,'bold'), pady=25)
T.pack(side=LEFT, fill=BOTH)

s.config(command=T.yview)
T.config(yscrollcommand=s.set)