0

ayant des problèmes à essayer de faire fonctionner le thread en python en utilisant le génial Appjar package.La fonction python appjar ne tourne pas

Le programme suivant doit compter dans une liste et mettre à jour une barre de progression simultanément. Je l'ai suivi le appjar documentation for threading, mais il est de retour dans la NameError: name 'percent_complete' is not definedapp.thread (ligne 35), dans lequel vous êtes censé insérer la fonction params - mon code est ci-dessous:

from appJar import gui 
import time 

# define method the counts through a list of numbers, and updates the progress meter 

def press(btn): 
    objects = [1,3,6] 
    total = len(objects) 
    current_object = 0 
    for i in objects: 
     print(i) 
     current_object += 1 
     current_percent_complete = (current_object/total) * 100 
     updateMeter(current_percent_complete) 
     time.sleep(1) 

def updateMeter(percent_complete): 
    app.queueFunction(app.setMeter, "progress", percent_complete) 

# create a GUI variable called app 

app = gui("Login Window") 
app.setBg("orange") 
app.setFont(18) 

# add GUI elements : a label, a meter, & a button 

app.addLabel("title", "COUNTER") 
app.setLabelBg("title", "blue") 
app.setLabelFg("title", "orange") 

app.addMeter("progress") 
app.setMeterFill("progress", "green") 

app.addButton("START COUNTING", press) 

# put the updateMeter function in its own thread 

app.thread(updateMeter, percent_complete) 

# start the GUI 

app.go() 

je peux me débarrasser de l'erreur par la définition percent_complete comme ceci:

from appJar import gui 
import time 

# define method the counts through a list of numbers, and updates the progress meter 

percent_complete = 0 

def press(btn): 
... 

Cependant, lorsque la charge de l'interface graphique et le bouton est enfoncé, il ne se visse pas. Au lieu de cela, il parcourt la liste, puis met à jour la barre de progression.

Quelqu'un a-t-il rencontré le même problème? n'importe quelle idée serait awesomely appréciée! Merci!

Répondre

0

Il y a quelques problèmes ici:

  • D'abord, je ne suis pas sûr que vos comptes donnent lieu à de bons pourcentages de mettre à jour le compteur avec, de sorte que vous pourriez ne pas voir beaucoup de changement - si vous emploierez i? Deuxièmement, le GUI ne sera pas mis à jour jusqu'à ce que la boucle (et les somme à l'intérieur) se terminent tous. Au lieu de cela, vous devriez essayer de compter le nombre d'éléments à traiter, et itérer eux avec une fonction after(), voir ici: http://appjar.info/pythonLoopsAndSleeps/#conditional-loops

  • En troisième lieu, l'appel à app.thread() à la fin n'accomplit pas grand chose - il appelle la fonction update_meter() avec un paramètre qui n'existe pas, il peut être supprimé.

  • Quatrièmement, la fonction update_meter() réelle n'est pas nécessaire, comme vous ne l'utilisez vraiment un fil - qui peut être enlevé et ...

pour cette solution, une fois que vous avons eu un regard sur les mathématiques:

current_object = 0 
def press(btn): 
    global current_object 
    current_object = 0 
    processList() 

def processList(): 
    global current_object 
    objects = [1,3,6] 
    total = len(objects) 
    if current_object < total: 
     i = objects[current_object] 
     print(i) 
     current_object += 1 
     current_percent_complete = (current_object/total) * 100 
     app.setMeter("progress", current_percent_complete) 
     app.after(1000, processList) 

MISE à JOUR: juste pour clarifier la question de mathématiques, vous divisant un entier par un autre: 0/3, 1/3, 2/3, 3/3 et ainsi de suite. Dans python2, cela donnera 0, dans python3 vous obtiendrez des fractions.