时钟问题

时间:2019-05-22 10:19:41

标签: python python-3.x

我正在解决这样的请求:

--------------------------------------------------- -------------------------

创建一个用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”。

2 个答案:

答案 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