尝试使用令人敬畏的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加载按钮时,它不会进行线程化。相反,它遍历列表,然后更新进度条。
有没有人遇到同样的问题?任何见解都会非常感激! 谢谢!
答案 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中你将获得分数。