1

Je veux créer un petit programme qui lit une chanson et une image apparaît lorsque le curseur de la souris est déplacé. J'ai 3 fonctions pour 3 actions et je veux les exécuter en même temps mais je ne peux pas l'accomplir. Pourriez-vous m'aider?Comment démarrer des threads en même temps en Python

import random 
import threading 
import pyautogui 
import pygame 

from tkinter import * 


def play_song(): 
    file = 'Troll_Song.ogg' 

    pygame.mixer.init() 
    pygame.mixer.music.load(file) 
    pygame.mixer.music.play() 

    while pygame.mixer.music.get_busy(): 
     pygame.time.Clock().tick(10) 


def create_window(): 
    while True: 
     root = Tk() 
     root.title('Trololo...') 

     photo = PhotoImage(file='trollface.gif') 
     label = Label(root, image=photo) 
     label.pack() 

     w = 620 # width for the Tk root 
     h = 620 # height for the Tk root 

     # get screen width and height 
     ws = root.winfo_screenwidth() # width of the screen 
     hs = root.winfo_screenheight() # height of the screen 

     # random positions of the window 
     x = random.randint(0, ws - 620) 
     y = random.randint(0, hs - 620) 

     # set the dimensions of the screen 
     # and where it is placed 
     root.geometry('%dx%d+%d+%d' % (w, h, x, y)) 

     root.mainloop() 


def mouse_move(): 
    width, height = pyautogui.size() 

    while True: 
     x = random.randint(0, width) 
     y = random.randint(0, height) 

     pyautogui.moveTo(x, y, duration=0.3) 


if __name__ == '__main__': 
    t1 = threading.Thread(target=create_window()) 
    t2 = threading.Thread(target=play_song()) 
    t3 = threading.Thread(target=mouse_move()) 

    t1.start() 
    t2.start() 
    t3.start() 

Répondre

2

Je ne sais pas si c'est le seul problème avec votre code, mais je peux dire au sujet de filetage - target doit être une fonction, au lieu que vous appelez des fonctions, ce qui les exécuter dans thread principal. Donc, si la première fonction est une boucle infinie - le programme ne créera pas de thread, car il bloquera l'exécution de la première fonction. Voici comment vous le faites:

t1 = threading.Thread(target=create_window) 
t2 = threading.Thread(target=play_song) 
t3 = threading.Thread(target=mouse_move) 
+0

merci, cela a fonctionné. – sziko

+0

@sziko vous êtes les bienvenus –