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 中,您将得到分数。