3

我现在正在为一个个人项目创建一个程序的一部分,我需要一些帮助。

以下是该程序的工作原理:

  1. 用户输入运行时间
  2. 用户输入文本 - 文件已修改
  3. 定时器启动
  4. 可选用户可以输入“密码”来中断定时器
  5. 动作反转

除了计时器之外,我已经对所有步骤进行了编码,因为我正在尝试找出最好的方法来做到这一点。理想情况下,我希望计时器显示倒计时,如果用户输入某个“密码”,计时器就会中断并跳到第 5 步。

最好的方法是使用线程吗?过去我对线程的工作不多。我只需要以某种方式显示计时器,同时还可以将控制权交还给用户,以防他们想输入该密码。

感谢您提供的任何帮助。

这是代码:

import time
import urllib
import sys

def restore():
     backup = open(r'...backupfile.txt','r')
     text = open(r'...file.txt', 'w+')
     text.seek(0)

     for line in backup:
         text.write(line)

     backup.close()
     text.close()

text = open(r'...file.txt', 'a+')
backup = open(r'...backupfile.txt','w+')
text.seek(0)

for line in text:
    backup.write(line)

backup.close()

while True:
    url = raw_input('Please enter a URL: ')
    try:
        if url[:7] != 'http://':
            urllib.urlopen('http://' + url) 
        else:
            urllib.urlopen(url)
    except IOError:
        print "Not a real URL"
        continue 

    text.write(url)

    while True:
        choice = raw_input('Would you like to enter another url? (y/n): ')
        try:
            if choice == 'y' or choice == 'n':
                break
        except:
            continue

        if choice == 'y':
            text.seek(2)
            continue

        elif choice == 'n':
            while True:
                choice = raw_input('Would you to restore your file to the original backup (y/n): ')
                try:
                    if choice == 'y' or choice == 'n':
                        break
                except:
                    continue

            if choice == 'y':
                text.close()
                restore()
                sys.exit('Your file has been restored')
            else:
                text.close()
                sys.exit('Your file has been modified')

如您所见,我还没有添加计时部分。这很简单,只需将 url 添加到文本文件然后关闭它们。如果用户想要原始文件,则调用 reverse()。

4

1 回答 1

1

在 Windows 下,您可以使用 msvcrt 请求密钥。询问密码实际上更复杂,因为您必须跟踪多个密钥。该程序以 F1 停止。

import time
import msvcrt

from threading import Thread
import threading

class worker(Thread):

    def __init__(self,maxsec):
        self._maxsec = maxsec
        Thread.__init__(self)
        self._stop = threading.Event()

    def run(self):
        i = 1
        start = time.time()
        while not self.stopped():
            t = time.time()
            dif = t-start
            time.sleep(1) # you want to take this out later (implement progressbar)

            # print something once in a while
            if i%2==0: print '.',

            #check key pressed
            if msvcrt.kbhit():
                if ord(msvcrt.getch()) == 59:
                    self.stop()


            #do stuff

            # timeout
            if dif > self._maxsec:
                break

            i+=1

    def stop(self):
        print 'thread stopped'
        self._stop.set()

    def stopped(self):
        return self._stop.isSet()

print 'number of seconds to run '
timeToRun = raw_input()

#input files
#not implemented

#run
w = worker(timeToRun)
w.run()

#reverse actions
于 2012-10-25T16:25:44.793 回答