首页 > 解决方案 > 从单独的 python 线程更新 newt (snack.py) 接口

问题描述

我第一次更新列表时它工作得很好,从计时器我得到了最后一个文本项的不可选择的副本,即两个“第四”,但只有一个工作。我想异步更新我的蝾螈接口,但我的想法已经不多了。谢谢你。

问题图片

from __future__ import absolute_import, print_function, unicode_literals
from snack import *

import subprocess
import time, threading

def time_counter():
    global li
    global screen
    li.replace("PROBLEM below",2)
    screen.refresh()

screen = SnackScreen()

li = Listbox(height = 35, width = 160, returnExit = 1)
li.append("First", 0)
li.append("Second", 1)
li.append("Third", 2)
li.append("Forth", 3)

bb = ButtonBar(screen, (("Ok", "ok"), ("Cancel", "cancel")),1)

g = GridForm(screen, "My Test", 1, 4)
g.add(li, 0, 0)
g.add(bb, 0, 3, growx = 1)

threading.Timer(2, time_counter).start()

li.replace("WORKS FINE",2)

g.runOnce()
screen.finish()

标签: pythonmonitorwhiptail

解决方案


明确删除和重新插入一个项目在原则上确实有效,但由于屏幕上的顺序在几次迭代后变得混乱,并不是真的。

因此,只需清除整个列表,更新项目并重新创建。

box_list = ["First", "Second", "Third", "Forth"]
...
cur=li.current()
box_list[cur]="NO PROBLEM"
li.clear();
for idx, val in enumerate(box_list):
  li.append(val, idx)
li.setCurrent(cur)

推荐阅读