python appjar函数没有线程

时间:2017-10-07 02:19:22

标签: python multithreading user-interface python-3.5 python-multithreading

尝试使用令人敬畏的Appjar package来在python中使用线程时遇到问题。

以下程序需要统计列表,并同时更新进度条。我已经关注了appjar documentation for threading,但它正在# -*- coding: utf-8 -*- numCoinAchievements = 0 nextCoinLevel = 1000 for coins in range(0, 100000, 33): if coins >= nextCoinLevel: numCoinAchievements += 1 if numCoinAchievements == 1: nextCoinLevel = 10000 elif numCoinAchievements == 2: nextCoinLevel = 15000 else: break print("") print("You have a new achievement!") print("[✔] - Earn %d points" % nextCoinLevel) print("You have %d/6 coin achievements" % numCoinAchievements) print("") (第35行)中返回NameError: name 'percent_complete' is not defined,您要在其中插入函数参数 - 我的代码如下:

app.thread

我可以通过定义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() 来解决错误:

percent_complete

但是,当按下GUI加载按钮时,它不会进行线程化。相反,它遍历列表,然后更新进度条。

有没有人遇到同样的问题?任何见解都会非常感激! 谢谢!

1 个答案:

答案 0 :(得分:0)

这里有几个问题:

  • 首先,我不确定您的数学结果是否能够很好地更新仪表,因此您可能看不到太多变化 - 如果您使用i

  • 其次,在循环(以及其中的睡眠)全部完成之前,GUI不会更新。相反,您应该尝试计算要处理的项目数,并使用after()函数对其进行迭代,请参阅此处:http://appjar.info/pythonLoopsAndSleeps/#conditional-loops

  • 第三,最后对app.thread()的调用没有实现太多 - 它使用不存在的参数调用update_meter()函数,可以将其删除。

  • 第四,实际的update_meter()函数不是必需的,因为你实际上并没有使用线程 - 也可以删除...

一旦你看了数学,就试一试:

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)

更新:为了澄清数学问题,你要将一个整数除以另一个:0 / 3,1 / 3,2 / 3,3 / 3等等。在python2中,这将导致0,在python3中你将获得分数。