1

我正在使用我编写的 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 设置中成为可能)。

4

1 回答 1

1

即使没有上下文之外的任何内容,使用祝福代替祝福也不会出现光标不返回先前位置的问题with

使线程成为守护进程解决了另一个问题。

于 2022-01-29T19:05:39.950 回答