我正在使用我编写的 python 库与自定义 USB 设备进行交互。库需要发送和接收数据。我还需要交互调用方法。目前我使用两个shell,一个只接收,另一个只发送。后者在 (i)python REPL 中。它可以工作,但很笨拙,所以我想将这两个东西合并到一个 shell 中,这样可以在一个上下文中从双方访问数据结构。这很好用。问题出在 UI 中。
实际上,接收部分需要异步打印一些信息。所以我写了如下内容:
#!/usr/bin/python
import threading
import time
import blessings
TOTAL=5
def print_time( thread_id, delay):
count = 0
t=blessings.Terminal()
while count < TOTAL:
time.sleep(delay)
count += 1
stuff = "Thread " + str(thread_id) + " " + str(time.ctime(time.time())) + " -- " + str(TOTAL - count) + " to go"
with t.location(t.width - len(stuff) - 1, thread_id):
print (stuff, end=None )
print("", end="") # just return the cursor
try:
t1 = threading.Thread( target = print_time, args = (1, 2, ) )
t1.start()
print ("Thread started")
except:
print ("Error: unable to start thread")
那是我__init__.py
的模块文件。它有点工作,但它有两个问题:
当线程正在运行时,您既不能使用 CTRL-D 也不能退出 REPL
sys.exit()
(这就是我在TOTAL=5
上面使用的原因,因此如果您尝试此代码,您的生活会更轻松)。这是一个问题,因为我的实际线程需要是一个无限循环。我想一种解决方案可能是通过自定义调用退出,这将导致无限循环中断,但有什么更好的吗?光标未正确返回到其先前位置
- 如果我删除
end=""
带有注释的行中的# just return the cursor
,它有点工作,但显然在光标所在的位置打印一个不需要的换行符(除了添加不需要的之外,这会使我们可能在那里发生的其他输入和/或输出混乱新队) - 如果我离开
end=""
它不会返回光标,即使我添加了一些要打印的东西,例如print(".", end="")
- 点.
打印在正确的位置,但闪烁的光标和输入打印在顶部
- 如果我删除
我知道这是两个不相关的问题,我本可以提出两个单独的问题,但我需要两个问题的答案,否则这是一个有争议的问题。或者,我对其他解决方案持开放态度。我想到了一个单独的 GTK 窗口,这可能会起作用,但它是一个低于标准的解决方案,因为我真的希望它仅在 CLI 中工作(以使其在 ssh-without-X-tunneling 设置中成为可能)。