# Autres langages > Python > GUI >  GUI et multithread

## fgallais

Bonjour,

Pour un projet, j'essaye de lier du multithread  une interface graphique. Voici l'ide du projet : On modlise un restaurant par un serveur python. Des clients peuvent se connecter au serveur pour commander leur repas. Chaque client est livr par un livreur. Il y a un nombre fini de livreur, si tous les livreurs sont occups, les nouveaux clients doivent attendre. Pour l'instant, je ne suis qu'au dbut du dveloppement. J'ai mon serveur et mon client. Le client se connecte au serveur et reste connect un certain temps jusqu'a etre livr. Comme plusieurs clients peuvent se connecter en mme temps, je gre cela par du multithread.

Mon probleme arrive lorsque je veux lier ce code  une interface graphique. En effet, j'aimerais faire une interface assez simple mais dynamique qui permet de voir la liste des clients qui se connectent, qui sont en attente de livraison ou qui ont t livrs et la liste des livreurs qui sont disponibles ou non. Le problme est que j'ai fait cette interface sous Tkinter et lorsque j'appelle des fonctions de mon interface dans ma fonction thread, j'obtiens l'erreur : main thread is not in main loop.
Aprs quelques recherches, j'ai trouv que Tkinter a bien un probleme avec le multithread mais je n'ai pas du tout compris la solution apporte par les internautes... 
Je voudrais donc savoir s'il y a une solution "simple" ou un autre module que Tkinter qui pourrait faire l'affaire.

Merci

----------


## VinsS

Salut,

Si tu n'es pas tenue  TKinter, alors je te recommande PyQt.

http://pyqt.developpez.com/tutoriels/

----------


## wiztricks

Salut,




> Aprs quelques recherches, j'ai trouv que Tkinter a bien un probleme avec le multithread mais je n'ai pas du tout compris la solution apporte par les internautes... Je voudrais donc savoir s'il y a une solution "simple" ou un autre module que Tkinter qui pourrait faire l'affaire.


Quelque soit le GUI (tk, Qt,...) il n'est pas recommand:
- d'utiliser pour le GUI un autre thread que le thread principal,
- d'effectuer des mises  jour des widgets depuis des threads secondaires.




> Le client se connecte au serveur et reste connect un certain temps jusqu tre livr. Comme plusieurs clients peuvent se connecter en mme temps, je gre cela par du multithread.


Rien ne vous empche de dmarrer le GUI et le serveur dans un thread secondaire.

- W

----------


## fgallais

Je crois que je n'ai trs bien compris la notion de thread.
Pour moi on a un serveur, et ds qu'un client se connecte, on cre un nouveau thread. Le problme est qu'une fois qu'un client est connect, il lui arrive des choses, et je veux que a se voit sur l'interface graphique. Donc je n'arrive pas  comprendre comment l'interface graphique pourrait etre gre  l'extrieur...

----------


## wiztricks

Salut,




> Pour moi on a un serveur, et ds qu'un client se connecte, on cre un nouveau thread. Le problme est qu'une fois qu'un client est connect, il lui arrive des choses, et je veux que a se voit sur l'interface graphique. Donc je n'arrive pas  comprendre comment l'interface graphique pourrait etre gre  l'extrieur...


L'interface graphique est dans sa main-thread le serveur et les diffrents threads correspondant  chaque client tournent dans le mme programme.
Je ne comprends pas ce qui serait "exterieur"  quoi.

Pour le reste, postez du code....

- W

----------


## fgallais

C'est vrai que je ne suis pas trs claire. Peut tre que ce sera plus simple d'expliquer avec mon code :



```

```

Il s'agit, pour moi, de la partie serveur.

Donc, quand un client se connecte, on entre dans la fonction "f_thread", jusqua ce que le client se deconnecte. C'est a dire que pour moi, toutes les modifications apportes sur le client s'effectuent dans cette fonction. Et c'est de cette fonction que j'ai essay d'appeler une fonction de mon interface et que j'ai eu mon erreur. Je ne vois donc pas comment faire pour lier client et interface si je n'utilise pas l'interface dans f_thread.

J'espere avoir t claire.. merci de votre aide

----------


## wiztricks

Salut, 

Comme dans votre but de code, la partie GUI n'est pas prsente pas facile...
De toutes faons, l'architecture de votre code devrait ressembler  :


```

```

On dmarre le GUI dans le thread principal, le serveur dans un thread secondaire et les mises  jour se font via un mcanisme o on poste une requte depuis le thread serveur qui s'excutera dans le contexte du thread principal (GUI).

Une faon plus conventionnelle est de passer par une Queue (au lieu d'empiler dans la mainloop du GUI) qu'on vide via une tache rptitive:


```

```

Tous les GUI imposent cette architecture. 
Les diffrences sont "comment la mettre en uvre".


- W

----------


## fgallais

J'ai fait l'interface dans un fichier  part car avec tous les composants, cela devient vite trs long. Voil le code en question :



```

```


Ensuite, j'importe ce fichier dans celui ou j'ai mon code serveur. Le probleme est que si je reprend votre code de cette faon :


```

```

Quand j'execute le programme, la fenetre s'affiche et se ferme directement.

----------


## wiztricks

Salut,

mtTkinter inclue un mcanisme sophistiqu de queuing qui fait que normalement, pas besoin d'en crire un autre.




> Quand j'execute le programme, la fenetre s'affiche et se ferme directement.


Si vous n'entrez pas dans la mainloop,  sort du programme.... et c'est normal.
Je n'ai pas test mais ceci devrait fonctionner:


```

```

Pour rsumer, la seule chose que vous avez  faire (avec mtThread) est de dmarrer le GUI dans la thread principale et le serveur dans un thread secondaire.
Si vous avez toujours des problmes, essayez de le reproduire avec un minimum de code (normalement vous n'avez pas besoin de votre serveur et de ses clients mais juste d'une ou plusieurs threads qui mettent  jour le GUI).

- W

----------


## fgallais

Bonjour, je viens de voir votre rponse. J'ai essay de faire comme vous me l'avez dit mais le probleme c'est que je ne peux pas connecter plusieurs clients en meme temps. J'ai donc fait a :



```

```


Mais, meme si je met tout ce qui concerne la fenetre en commentaire, a ne marche pas...
Quand je connecte un client la boucle se "bloque", time=1 puis time =2 puis plus rien. Je n'arrive pas  comprendre
Merci

----------


## wiztricks

Si vous crivez:


```

```

comment/quand   va pouvoir sortir de la mainloop?

edit: d'autre part ce qui est dans ce while, c'est le boulot du serveur qui devrait tre dans un thread.

- W

----------


## fgallais

Je suis dsole je ne vois vraiment pas comment faire ...

----------


## wiztricks

Salut,




> Je suis dsole je ne vois vraiment pas comment faire ...


Reprenez le dernier code que vous avez post et commencez par regrouper les instructions qui concernent le "serveur" dans une fonction.

- W

----------

