我正在解决这样的请求:
创建一个用Python编写的时钟应用程序,该应用程序将按以下时间间隔将以下值打印到stdout:
“每秒”“滴答”
“ t”
“砰”一声
在给定的秒数内仅应打印一个值,即在小时上打印“ bong”时,不应打印“ tick”和“ tock”值。
它应该运行三个小时,然后退出。
应该存在一种机制,供用户在程序运行时更改任何打印的值,即时钟运行10分钟后,我应该能够在不停止程序的情况下对其进行更改,以使其停止打印每秒“滴答”一声,开始打印“嘎嘎”。
我认为我能够正确地写成这样:
================================================ ============================== -每秒“滴答”
“ t”
“砰”一声
在给定的秒数内仅应打印一个值,即在小时上打印“ bong”时,不应打印“ tick”和“ tock”值。
它应该运行三个小时,然后退出。
for k in range (3): # 3 hours
for j in range(60): # one hour
for i in range(60):
print('Tick',i, j)
time.sleep(1)
for i in range(1):
print('Tock',i, j)
time.sleep(1)
for j in range(1):
print('Bong',j)
time.sleep(1)
但是如何写:
================================================ ============================= 用户应该有一种机制可以在程序运行时更改任何打印的值,即时钟运行10分钟后,我应该能够在不停止程序的情况下对其进行更改,以使其停止打印“刻度”每秒,然后开始打印“ quack”。
答案 0 :(得分:0)
您可以使用input
function向用户查询单行字符串。这将阻塞,直到提供输入为止:
start = time.time()
value = input('type a line: ') # wait for input from user
end = time.time()
print('You wrote', repr(value), 'after', end - start, 'seconds.')
由于必须无间断地提供您的输出,因此无法接受输入阻塞。您可以使用threading
module将您的程序分为两部分,这两部分不能互相阻塞。
一个线程向用户查询时间指示器,另一个线程打印适合当前时间的指示器。由于您的程序很简单,因此可以使用诸如dict
之类的普通类型在两部分之间交换数据。
indicators = {'second': 'tick', 'minute': 'tock', 'hour': 'bong'}
现在是打印部分。 threading
需要一个函数,因此我们必须定义一个。它需要我们的indicators
来从中读取。而不是单独的小时,分钟,秒循环,我们只跟踪秒,而是计算小时还是分钟。
import time
def indicate_time(indicators: dict):
for tick in range(60 * 60 * 3): # three hours total time
if tick % 60 * 60 == 0:
print(indicators['hour'])
elif tick % 60 == 0:
print(indicators['minute'])
else:
print(indicators['second'])
time.sleep(1)
对于输入部分,我们需要确定如何查询用户。例如,我们可以使用两阶段输入来询问类别(seconds
),然后询问新指标(TICK
)。最简单的情况就是要求所有指标之间使用分隔符。
我们必须为输入定义另一个函数(或使用主线程)。需要indicators
写入。我们使用input
来询问三个以空格分隔的值,作为秒,分钟和小时的新指标。
def update_indicators(indicators: dict):
message = ''
while True:
try:
indicators['second'], indicators['minute'], indicators['hour'] = \
input(message).split()
except ValueError: # got an incorrect number of arguments
message = 'Indicator for second, minute and hour separated by spaces: '
else:
message = ''
然后可以在线程中开始每个部分。打印线程应使程序保持活动状态,而输入线程应中止其余部分。除了在新线程中运行打印之外,您还可以在主线程中运行打印。
import threading
input_thread = threading.Thread(
target=update_indicators,
args=(indicators,),
daemon=True,
)
input_thread.start()
indicate_time(indicators) # run the printer in the main thread
答案 1 :(得分:0)
我将以上所有内容合并在一个程序中。运行不太正常。
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>>
RESTART: C:\Users\marcin.idzik\Downloads\Kultura_Czytanie (1) (4)\Kultura_Czytanie (1)\clock.py
bong
Indicator for second, minute and hour separated by spaces: 0fd dsf ggs
RESTART: C:\Users\marcin.idzik\Downloads\Kultura_Czytanie (1) (4)\Kultura_Czytanie (1)\clock.py
bong
Indicator for second, minute and hour separated by spaces: kj ke
tickIndicator for second, minute and hour separated by spaces:
kk ti aza
tick
当用户提供新值时:
Indicator for second, minute and hour separated by spaces:
kk ti aza
所以现在:
kk ti aza
应采用并分别替换“分钟”,“秒”,“小时”值:
indicators = {'second': 'tick', 'minute': 'tock', 'hour': 'bong'}
现在,在用户输入新值之后,仍显示旧值:
kk ti aza
tick