Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Tk + networking

+3 votes

Bon j'inaugure en posant la première question. Et comme elle est pourrie vous allez être déçus.

Pour un de mes projets, je fais une GUI à l'aide de Tk, et je suis amené à rajouter du réseau par dessus.

Le principe du projet est l'implémentation d'un protocole d'instant messaging obscur, ce qui implique donc d'avoir une socket ouverte en permanence afin de recevoir et d'envoyer des infos au serveur.

Un truc dans ce genre là:

def send_callback(self, e):
    send(apply_protocol(self._text.get()))

def poll(self):
    while True:
        data = self._socket.recv(BLKSIZE)
        recv(reverse_protocol(data))

Les fonctions send et recv faisant le liant entre la partie socket et la partie GUI.

Instinctivement, je comptais donc faire un thread pour la partie réseau. Et puis je me suis demandé si la GIL ne pourrait pas me faire chier dans ce cas là.

Je me suis aussi demandé si un module de coroutine type gevent ne pourrait pas résoudre mon problème.

Ou bien même,gros ouf que je suis, si twisted ne pourrait pas me rendre un fier service. Mais comme je l'ai jamais utilisé, la phase apprentissage risque de me faire perdre plus de temps que le module m'en fait gagner.

Bref, la question est simple: Dans le cadre d'un programme python qui incorpore GUI et networking, quelle est la meilleure solution ?

demandé 1-Jan-2015 par Arza (726 points)
edité 1-Jan-2015 par Arza
Il faut plus d'informations pour te répondre : quelles genre d'opérations réseaux tu veux faire ? A quel moment dans ton programme ? Poste un peu de code.

La question ne serait-elle pas plutôt du genre : comment communiquer entre mon interface graphique et mon thread ?

Met plutôt ce genre de remarques en commentaires, sous la question originale. Là tu viens de donner une réponse à la question, et sur ce genre de plateforme, on veut que chaque réponse soit une solution, pas une autre question, afin que les nouveaux venus trouvent rapidement la solution à leurs problèmes.

Oui et non.

Faire cohabiter une interface graphique et du réseau c'est pas le problème majeur, c'est même plutôt facile à faire.
La question se posait plus d'un point de vue conceptuel et efficacité. Faire l'implem de l'une ou l'autre solution c'est secondaire.

En fait ce genre de question est pas forcement adapté à une plate-forme Q&A, vu que vu comment elle est tournée ça tend plus à apporter un débat.

1 Réponse

+4 votes
 
Meilleure réponse

Twisted est probablement ce que tu veux :

  • il va gérer la socket pour toi.
  • il va gérer le côté non bloquant pour toi.
  • il vient déjà avec un tas de protocoles prêt à l'usage et te permet de créer facilement les tiens.
  • son event loop s'intègre avec celles de nombreux toolkits GUI avec deux lignes de configuration.
répondu 18-Jan-2015 par Sam (4,978 points)
sélectionné 18-Jan-2015 par Arza

Comme je l'expliquais en commentaire de la question, je me suis rendu compte que la façon dont la question était tournée, ainsi que ce que j'en attendais (i.e. un débat) ne convenait pas à une plateforme Q&A.

Je vais néanmoins accepter ta réponse, et je pense essayer et faire ici même, si c'est acceptable, un retour des méthodes évoquées.

Cool, merci :)

...