python appjar 函数没有线程化
python appjar function doesn't thread
在尝试使用很棒的 Appjar package.
在 python 中运行线程时遇到问题
下面的程序需要统计一个列表,同时更新一个进度条。我遵循了 appjar documentation for threading,但它在 app.thread
(第 35 行)中返回了 NameError: name 'percent_complete' is not defined
,您打算在其中插入函数参数 - 我的代码如下:
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
来消除错误:
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):
...
但是,当 GUI 加载并按下按钮时,它不会线程化。相反,它遍历列表,然后更新进度条。
有没有人遇到过同样的问题?任何见解将不胜感激!
谢谢!
这里有几个问题:
首先,我不确定您的数学计算结果是否适合更新电表,因此您可能看不到太大变化 - 您应该使用 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 中,您将得到分数。
在尝试使用很棒的 Appjar package.
在 python 中运行线程时遇到问题下面的程序需要统计一个列表,同时更新一个进度条。我遵循了 appjar documentation for threading,但它在 app.thread
(第 35 行)中返回了 NameError: name 'percent_complete' is not defined
,您打算在其中插入函数参数 - 我的代码如下:
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
来消除错误:
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):
...
但是,当 GUI 加载并按下按钮时,它不会线程化。相反,它遍历列表,然后更新进度条。
有没有人遇到过同样的问题?任何见解将不胜感激! 谢谢!
这里有几个问题:
首先,我不确定您的数学计算结果是否适合更新电表,因此您可能看不到太大变化 - 您应该使用
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 中,您将得到分数。