Python打印保持同一条线

时间:2014-02-05 10:23:32

标签: python macos

import os
import time

h = 0
s = 0
m = 0

while s <= 60:
    os.system('clear')
    print h, "hours", m, 'minutes', s, 'seconds'
    time.sleep(1)
    s += 1
    if s == 60:
        m += 1
        s = 0
    elif m == 60:
        h += 1
        m = 0
        s = 0

我上面有这个代码。这一切都很好,并做了它的意图,但我想做它,以便它打印在同一行中的所有语句。例如,它应该打印出0小时0分0秒,然后在同一行打印出0小时0分1秒,第二个变量是唯一正在改变的东西。我该怎么做呢?我已经尝试过使用os.system('clear')命令,但它不起作用。我在Mac OSX 10.7上运行它。

3 个答案:

答案 0 :(得分:3)

您应该使用终端提供的内容。在大多数情况下,您需要使用'\r'(回车,返回该行的第一列);但是根据操作系统的不同,可能会对其进行解释,使其也附加换行符。我觉得我记得OSX可能会这样做。

此外,您还需要避免自动换行符print始终追加。您可以使用尾随逗号,但这有问题(杂散空间,没有刷新)。所以我建议改为使用sys.stdout.write(),因为如果没有新行通常不会进行刷新,您也应该明确使用sys.stdout.flush()

然后,返回第一列将不会删除旧输出,因此它只会被下一行覆盖。如果它比之前的那个短,你将有尾随垃圾。为避免这种情况,请再次使用终端提供的内容(通常'\x1b[K'将所有内容擦除到行尾但不移动光标,但如果这对您不起作用,只需打印一些空格或确保输出为始终格式化为相同的宽度。)

EL = '\x1b[K'  # clear to end of line
CR = '\r'  # carriage return
sys.stdout.write(("%d hours %d minutes %s seconds" + EL + CR) % (h, m, s))
sys.stdout.flush()

更合适的方法(除了使用文字序列的快捷方式)是使用官方的 curses 库。

import curses
curses.setupterm()
EL = curses.tigetstr('el')
CR = curses.tigetstr('cr')

如果CR真的不能像我们想要的那样在OSX上运行,那么你的termcaps中可能会有 goto 去特定的位置(例如第一列),或者你可以使用{{ 1}}(SC)和save_cursor(RC)恢复先前保存的位置:

restore_cursor

答案 1 :(得分:2)

试试这个:

print h, "hours", m, 'minutes', s, 'seconds', '\r'

你也应该看看Alfe的回答: - )

答案 2 :(得分:0)

在Python 3中,您可以使用这种代码:

Then(/^can assign multitimes$/) do
 assignee = $driver.find_element(:xpath, '//*
 [@id="left"]/div/div[1]/div[3]/div[5]/div[2]')
  if assignee.text().include? ','
  puts "Failed (request cannot be assigned to otherusers)"
  else
  puts "Passed (request cannot be assigned to otherusers)"
end
end