python多线程处理循环时中断

任务

在进行种子杯的比赛时,为了实现可视化的调试,目标是程序在进行自动寻路算法时,可以通过键盘输入暂停,查看当前地图状态,并可手动操作(玩蛇),通过键盘继续自动寻路。

通过以下方法进行实现。

控制台输出

需要使地图实时更新,并且稳定在一定的窗口,需要采用多行刷新。

python 控制台单行刷新,多行刷新

尝试demo,与需求基本一致

import curses
import time
import os
import random
stdscr = curses.initscr()
curses.noecho()     #不输出- -
curses.cbreak()     #立刻读取:暂不清楚- -
stdscr.keypad(1)    #开启keypad
stdscr.box()
width = os.get_terminal_size().columns
height = os.get_terminal_size().lines
c_y = height//2 - 1
c_x = width//2 - 10
stdscr.addstr(c_y+5,c_x,'press C to continue',curses.A_REVERSE)
while True:
    c = stdscr.getch()
    if c == ord('c') or c == ord('C'):
        break
zh_ = '1234567890-qwertyuiopasdfghjklzxcvbnm,[;l,]/~!@#$%^&*()_+}"?{:><}"'';'
while True:
    for linei in range(1,width-1):
        for linej in range(1,height-1):
            if linej == c_y:
                if linei <= 5 or linei+6 >= width:
                    stdscr.addstr(linej,linei,'$')
                else:
                    stdscr.addstr(linej,c_x,time.strftime('%Y-%m-%d %H:%M:%S'),curses.A_BOLD)
            else:
                randominx = random.randint(0,len(zh_)-1)
                stdscr.addstr(linej,linei,zh_[randominx])
    stdscr.move(c_y,c_x)
    stdscr.refresh()
    time.sleep(1)
curses.endwin()

查看使用文档:

Curses Programming with Python

_curses.error: addstr() returned ERR

原因是输出超出窗口,可以通过函数查看窗口大小

stdscr=curses.initscr()    
size=stdscr.getmaxyx()
stdscr.addstr(0,0,str(stdscr.getmaxyx()))

多线程

首先尝试一下

python在循环时如何监控键盘输入并对当前的循环进行操作

本人python新手,正在用python解决一些实际问题,现在想实现这样一个功能:
在一个循环里面检测键盘的输入,并根据输入的内容对当前的循环进行一些操作,或者在屏幕上增加几个按钮,用鼠标点也可以。
例如: 在一个 i=1到10的 for 循环里面,假如当前循环到i=5,我此时按下空格键,循环暂停,此时按->键,i从5跳到6,但循环还是暂停状态,输出的结果显示i=6的结果,同理若按<-键,i从5跳到4,输出显示i=4的结果,当再一次按下空格键时,循环继续。

#子线程监听键盘输入;
#输入s,暂停,等待输入;输入c,继续;
class tt(threading.Thread):
    i=2
    input_str=""
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        while 1:
            input_kb = str(sys.stdin.readline()).strip("\n")
            if input_kb=='s':   #stop
                self.i=1
                print("子进程捕获了s")
            elif input_kb=="c":    #continue
                self.i=0
                print("子进程捕获了c")
                self.input_str=input_kb
            else:
                self.input_str=input_kb
def main():
    my_t = tt()
    my_t.start()
    i=0
    while True:
        if my_t.i==1:
            while 1:
                print(my_t.i)
                input("请输入:")
                print("my_t.input_str"+my_t.input_str)
                if my_t.input_str=="->":
                    i+=1
                    print(i)
                elif my_t.input_str=="<-":
                    i-=1
                    print(i)
                elif my_t.input_str=="c":
                    break
        my_t.i=2
        i+=1
        print('hello',str(i))
        time.sleep(1)
main()

首先通过例程学习多线程的使用,通过实例化一个继承Thread.threading的对象,通过调用函数即可开启线程。

Python3 多线程

Leave a comment

Your email address will not be published. Required fields are marked *