Forum >> Principianti >> Utilizzo Socket

Pagina: Indietro 1 2 3 4 5 6 Avanti

L'intestazione con il FROM TO LEN a livello pratico delle nostre necessità non riveste alcuna importanza
... C'è quel "nostre" che mi preoccupa un po' ...
Il nostre era riferito alla mia combriccola che utilizzerà il Terminale ;) :)

La finestra rispetterà i ritorni a capo solo (e soltanto) se riceverà una stringa codificata quale utf-8, i singoli caratteri"\" e "n", passati come tali non verranno interpretati come new-line ... in pratica, dovresti decodificare l'insieme di bytes da passare alla finestra come 'utf-8'

msg = ['RECEIVED', data[86:-3].decode(encoding="UTF-8", errors="ignore")]

Questo è quello che c'è scritto

Veniamo ora ai punti di cui Ti volevo avvertire :

Dammi il tempo di leggere e tentare di capire

Comunque lo ho fatto "girare" per più di 10 ore continuative in ricezione sull'APRS

E lì viene giù di tutto in quanto a stramberie di caratteri; è lì che mi sono accorto di qualche problema ed ho aggiunto l'ignore di cui sopra



Ciao e grazie




PS : :) :) :) IO ho problema dei ritorni a capo; l'editor di questo Forum ne aggiunge a manetta







--- Ultima modifica di Pietro Bruno Lancerotto in data 2024-02-28 16:25:15 ---
--
Bruno L.
Veniamo ora ai punti di cui Ti volevo avvertire :

1 - in utility.Delivery vi sono diverse istruzioni "raise RuntimeError ...." esse stanno li perché dovrebbero essere intercettate e gestite, altrimenti emetteranno un traceback in una eventuale shell di avvio, ovviamente quando lo ho manipolato non ho "gonfiato" il codice con la gestione degli errori, pensaci ... al minimo trasforma i "raise" in "return"
Torno a farmi vivo; sono stato un po' occupato ( visite, esami, i 75 si fanno sentire :()

La parte 2 ho sistemato tutto come suggerito

Per quanto riguarda la parte 1 che riporto nel quoting, sono andato a leggere un po'.

In primis ho cercato una traduzione del vocabolo; trovato una mezza enciclopedia sui suoi possibili significati in lingua italiana. :)

Decidero se tenere aperta la console; sicuramente lo farò in fase iniziale giusto per vedere se ogni tanto appare qualcosa.





Ho fatto alcune aggiunte.

f = open("Terminale.ini", "r")
serverName = (f.readline()).strip("\n")
serverPort = int(f.readline())
f.close()
Ho aggiunto un file minimalista per poter cambiare IP; mi serve provare da remoto perchè non sempre ho qualcuno che mi faccia da sponda e quindi metto in funzione il tutto sull'IP settato nel router come da mie messaggi precedenti.




Ho poi intercettato i caratteri "strani" che inceppavano il sistema.

# Sostituzione caratteri accentati
TDT = TDT.replace("ò", "o'")
TDT = TDT.replace("à", "a'")
TDT = TDT.replace("ù", "u'")
TDT = TDT.replace("ì", "i'")
characters = "éè"
for x in range(2):
TDT = TDT.replace(charactersx, "e'")
characters = "£ç°§"
for x in range(4):
TDT = TDT.replace(charactersx, "_")





Perché l'abitudine è di scrivere in una certa maniera ed anche se ti dicono di evitare poi scappa lo stesso




Il sistema funziona; abbiamo provato per un paio d'ore in condizioni reali e la "banda bassotti" si è dichiarata più che contenta ed invia i ringraziamenti per il fondamentale aiuto




Comunque, thread e socket sono bestioline complicate ed approfondite, così come la strutturazione del codice ... hai ricevuto la mia email di risposta? Se ritieni posso inviarti una maccheronica traduzione (fatta da me e non pubblicabile) di un tutorial sui thread che ho trovato "buono" come spunto per approfondire l'argomento.


Si si ricevuta

Ti rispondo di là




Grazie ancora




--
Bruno L.
Pietro Bruno Lancerotto said @ 2024-03-04 16:26:19:
Veniamo ora ai punti di cui Ti volevo avvertire :

1 - in utility.Delivery vi sono diverse istruzioni "raise RuntimeError ...." esse stanno li perché dovrebbero essere intercettate e gestite, altrimenti emetteranno un traceback in una eventuale shell di avvio, ovviamente quando lo ho manipolato non ho "gonfiato" il codice con la gestione degli errori, pensaci ... al minimo trasforma i "raise" in "return"
...
In primis ho cercato una traduzione del vocabolo; trovato una mezza enciclopedia sui suoi possibili significati in lingua italiana. :)
Le istruzioni

raise RuntimeError('Gruppo %s non registrato' % group)
della classe utility.Delivery scatenano un errore di run-time, tale errore "dovrebbe" essere intercetato e gestito (ovviamente nella GUI) ma la faccenda richiederebbe tutta una serie di accorgimenti, comunque Ti suggerirei la lettura del capitolo 8 del tutorial, è un capitolo molto importante e significativo e "racconta" ciò che volevo indicare.

Comunque, Ti suggerivo di sostituire tae genere di istruzione con un semplice "return" ... praticamente di non far nulla per quelle condizioni di errore.





Riguardo al punto 2, per caso hai implementato "anche" quel "self.sok.settimeout(0.1)" che ho indicato come "soluzione di emergenza" per il daemon che rimarrebbe appeso?

Nel caso Tu lo abbia fatto, testa bene il punto, può comportare perdita di dati, un decimo di secondo è decisamente ingeneroso, utilizzato per test, una soluzione coerente sarebbe mooolto più laboriosa. Ho sollevato l'argomento principalmente per indicarTi che c'erano altre problematiche da vedere, circa i socket, che non è agevole trattare in un post.



Pietro Bruno Lancerotto said @ 2024-03-04 16:26:19:
Il sistema funziona; abbiamo provato per un paio d'ore in condizioni reali e la "banda bassotti" si è dichiarata più che contenta ed invia i ringraziamenti per il fondamentale aiuto

Se mi è riuscito di essere utile ne sono contento ... comunque, testatelo bene il Vostro terminale.

Ciao :)


Fatti non foste a viver come bruti...
Se mi è riuscito di essere utile ne sono contento ... comunque, testatelo bene il Vostro terminale.

Ciao :)

Eccomi ancora qui

In fase di test è emersa una richiesta circa la possibilità di modificare il messaggio dei Radiobutton con una variabile

Come scritto in precedenza ho aggiunto un file di configurazione che viene letto nella parte iniziale di pkt_gui_rcs_support

Ho aggiunto 4 righe che servivano ed ovviamente i testi utilizzati in pkt_gui_rcs_support funzionano

Le variabili sono global

Come previsto i 2 testi col nome dei bottoni in pkt_gui_rcs non funzionano

Il compilatore da errore e siferma




#self.RadiobuttonNP.configure(text=pkt_gui_rcs_support.textB1) #Radio Button n.1

self.RadiobuttonNP.configure(text='NON Partiti')




La prima riga è come "dovrebbe" essere nel mio immaginario

La seconda è quella originale




Ovviamente sono a chiederTi in che modo traslare le due variabili textB1 e textB2 da un modulo all'altro




I ringraziamenti sono scontati :) :)


--
Bruno L.
Pietro Bruno Lancerotto said @ 2024-05-12 10:49:53:
...
Ovviamente sono a chiederTi in che modo traslare le due variabili textB1 e textB2 da un modulo all'altro
Sinceramente, non ho ben capito cosa hai fatto, la natura del "problema" e "quando" il problema si presenta, leggere il traceback non sarebbe male.




Comunque, riepiloghiamo il certo : hai bisogno di cambiare il testo del controllo ptk_gui_rcs.PAGINA.RadiobuttonNP




Per poter cambiare il testo di un controllo, l'istanza alla classe PAGINA deve già essere inizializzata, così come devono già essere già caricate in memoria le variabili contenenti il testo, indipendentemente da dove siano collocate, domanda : la variazione del testo deve avvenire a oggetti già completamente inizializzati od in fase di caricamento?

Dubbio corollario, essendo il target un radiobutton, che senso ha cambiare il testo? è il "value" ciò che entrerebbe realmente in gioco




Poi, c'è da considerare il contesto in cui avviene la modifica, è in ptk_gui_rcs o in ptk_gui_rcs_support?




Chiarisci tali dettagli, poi vediamo che si fa.




Ciao

Fatti non foste a viver come bruti...
Sinceramente, non ho ben capito cosa hai fatto, la natura del "problema" e "quando" il problema si presenta, leggere il traceback non sarebbe male.
Se tento di eseguirla da IDE si ferma indicando un errore che casomai posso copiare enpostare




Comunque, riepiloghiamo il certo : hai bisogno di cambiare il testo del controllo ptk_gui_rcs.PAGINA.RadiobuttonNP
Dubbio corollario, essendo il target un radiobutton, che senso ha
cambiare il testo? è il "value" ciò che entrerebbe realmente in gioco

Esattamente per la riga sopra

Il motivo sulla domanda 2 è che se viene usato il terminale nella gara Maratona vanno bene i testi così come sono

Se usiamo il sistema in un altro tipo di gara ( SoapBox mi pare si chiamino; carretti lanciati in discesa ) i due testi andrebbero sostituiti con parole Partenza e Transito

Per poter cambiare il testo di un controllo, l'istanza alla classe PAGINA deve già essere inizializzata, così come devono già essere già caricate in memoria le variabili contenenti il testo, indipendentemente da dove siano collocate, domanda : la variazione del testo deve avvenire a oggetti già completamente inizializzati od in fase di caricamento?

Poi, c'è da considerare il contesto in cui avviene la modifica, è in ptk_gui_rcs o in ptk_gui_rcs_support?


Comincio dalla fine : i due testi da cambiare in ptk_gui_rcs, dove sono elencati tutti gli elementi dell'interfaccia

Le variabili sono inizializzate in fase si "boot" quando viene letto il file .ini




#**************************************

import tkinter as tk
import tkinter.ttk as ttk
from tkinter.constants import *
import os.path

import pkt_gui_rcs

from datetime import datetime
#import binascii

from utility import Chatterbox

terminale = None

def main(*args):
'''Main entry point for the application.'''
global root
root = tk.Tk()
# Creates a toplevel widget.
global _top1, _w1
_top1 = root
_w1 = pkt_gui_rcs.PAGINA(_top1)

global PST
global textB1
global textB2
global mexB1
global mexB2


f = open("Terminale.ini", "r")
serverName = (f.readline()).strip("\n")
serverPort = int(f.readline())
PST = (f.readline()).strip("\n")
textB1 = (f.readline()).strip("\n")
textB2 = (f.readline()).strip("\n")
mexB1 = (f.readline()).strip("\n")
mexB2 = (f.readline()).strip("\n")
f.close()

serverName = serverName.replace(" ", "")
PST = PST.replace(" ", "")
_w1.PostName.set(PST)

global oggi
Calendario()
Apertura = ("Avvio applicazione il " + oggi + "\n")
Salvataggio(Apertura)
_w1.TESTO_RX.add_text(Apertura)

global terminale
# create TCP socket
terminale = Chatterbox(serverName, serverPort)
# connect socket to remote server at (serverName, serverPort)

terminale.connect()




#*****************************

E qui termina la parte iniziale




Se pensi sia più semplice allego i 3 file + il file.ini




Grazie


--
Bruno L.
Evitiamo per il momento di affrontare l'intera strutturazione (3 file? prima erano 2)

Dal codice inserito su, vedo che nel momento in cui instanzi "_w1" le variabili globali che vorresti utilizzare nella costruzione della gui non sono neanche dichiarate ... purtroppo, la strutturazione del codice è MOLTO importante, credo sia questa l'origine del problema, prova a strutturare come lo stralcio sotto
...
terminale = None

root = None

PST = ''
textB1 = ''
textB2 = ''
mexB1 = ''
mexB2 = ''


#****************************************

def initialize():
    global PST
    global textB1
    global textB2
    global mexB1
    global mexB2

    f = open("Terminale.ini", "r")
    serverName = (f.readline()).strip("\n")
    serverPort = int(f.readline())
    PST = (f.readline()).strip("\n")
    textB1 = (f.readline()).strip("\n")
    textB2 = (f.readline()).strip("\n")
    mexB1 = (f.readline()).strip("\n")
    mexB2 = (f.readline()).strip("\n")
    f.close()
    

def main(*args):
    '''Main entry point for the application.'''
    initialize()
    global root
    root = tk.Tk()
    #root.protocol( 'WM_DELETE_WINDOW' , root.destroy) - sostituita in PAGINA
    # Creates a toplevel widget.
    global _top1, _w1
    _top1 = root
    _w1 = pkt_gui_rcs.PAGINA(_top1)

    #global PST
    #PST = "GENERICI"

    global terminale

    serverName = "localhost"
...
certezza non ho ma penso che il problema lamentato dovrebbe risolversi.
Inoltre, data l'inizializzazione di PST la ridefinizione dello stesso in "main" dovrebbe essere ridondante, perciò la ho commentata.

Fai sapere

P.S. : impara ad utilizzare il tasto "code" (<>) nell'editor dei post, essere chiari è importantissimo.
edit: corretto uno strafalcione



Ciao



--- Ultima modifica di nuzzopippo in data 2024-05-13 08:44:18 ---
Fatti non foste a viver come bruti...
Evitiamo per il momento di affrontare l'intera strutturazione (3 file? prima erano 2)

Il terzo è utility.py che hai realizzato Tu :)

C'è poi il quarto, e cioè Terminale.ini

Credo sia opportuno aggiornare il tutto allo status attuale per cui allego lo zip con tutto il malloppo

Nel file pkt_gui_rcs.py ho aggiunto questo per far funzionare il tutto


code <
textB1 = "Bottone 1"
textB2 = "Bottone 2" >


Se commentati si verifica errore perchè non "traslati" da ... support.py




Ho spostato la lettura del Terminale.ini s initialize come suggerito ma ho dovuto inserirci anche alcune parti che nel frattempo avevo aggiunto

per esempio :

code <



global serverName

global serverPort

>

Anche se non è presente il suondmodem il terminale si apre comunque riportando una serie di errori relativi al mancato collegamento




Ci leggiamo








--
Bruno L.
Allegati
Pietro Bruno Lancerotto said @ 2024-05-13 13:28:32:
Evitiamo per il momento di affrontare l'intera strutturazione (3 file? prima erano 2)

Il terzo è utility.py che hai realizzato Tu :)
C'è poi il quarto, e cioè Terminale.ini
Credo sia opportuno aggiornare il tutto allo status attuale per cui allego lo zip con tutto il malloppo
...
Già, avevo dimenticato utility ...

In ogni caso, il problema posto è stato superato?

Fatti non foste a viver come bruti...
In ogni caso, il problema posto è stato superato?

No

Nel file pkt_gui_rcs.py ci sono queste 2 righe
textB1 = "Bottone 1"
textB2 = "Bottone 2"

Se le commento, alla riga

self.RadiobuttonNP.configure(text=textB1) #Radio Button n.1

anziche mostrare il testo letto dal file ini da errore







--- Ultima modifica di Pietro Bruno Lancerotto in data 2024-05-13 15:08:06 ---
--
Bruno L.


Pagina: Indietro 1 2 3 4 5 6 Avanti



Esegui il login per scrivere una risposta.