问题

2024-05-16 23:19:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了这样一个需要解决的请求:

------------------------------------------------------------------------你知道吗

创建一个用Python编写的时钟应用程序,该应用程序将按以下间隔将以下值打印到stdout:

  • 每秒钟“勾选”

  • 每分钟“tock”

  • “邦”每小时一次

在给定的一秒钟内只应打印一个值,即在小时打印“bong”时,不应打印“tick”和“tock”值。你知道吗

它应该运行三个小时然后退出。你知道吗

应该存在一种机制,用户可以在程序运行时更改任何打印的值,即在时钟运行10分钟后,我应该能够在不停止程序的情况下更改它,以便它每秒停止打印“嘀嗒”,而开始打印“嘎嘎”。你知道吗

----------------------------------------------------------------------------你知道吗

我想我能够正确地写下:

你知道吗============================================================================== -“滴答”每秒钟

  • 每分钟“tock”

  • “邦”每小时一次

在给定的一秒钟内只应打印一个值,即在小时打印“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分钟后,我应该能够在不停止程序的情况下更改它,以便它每秒停止打印“嘀嗒”,而开始打印“嘎嘎”。你知道吗


Tags: 用户in程序运行应用程序fortimerangesleep
2条回答

我在一个程序中综合了以上所有内容。运行不太正常。你知道吗

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

可以使用^{} 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.')

由于必须不中断地提供输出,因此不接受对输入的阻塞。您可以使用^{} 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

相关问题 更多 >