在Windows中暂停并恢复Python 3.42中正在运行的脚本
我是Python新手,已经在谷歌上搜索了几天,阅读了我在这个论坛上找到的所有内容。也许我不完全理解,但我还没有找到解决问题的办法。已经请求原谅如果我的问题已经有了答案,那么我还没有理解它 我想为我的程序Tennismatch创建一个暂停函数。该程序将在运行时打印网球比赛的分数,如下所示:15-0、15-15等,直到比赛结束。它将逐行打印分数 我希望用户能够在x个球数、游戏数等之后暂停。因此,我不知道用户何时想暂停,在用户暂停后,我希望用户能够在原来的位置恢复tennismatch 我已经看到了时间。睡眠,但正如我所理解的,你必须知道什么时候你想暂停使用这个,而且它也不是我想要的不确定的暂停。有了输入,它是一样的 我将在代码完成后制作一个GUI。为任何能让我解决问题的事情感到高兴 我使用Windows和Python 3.42,并在Shell中运行该程序 一段代码尚未全部编写完毕,这更像是一种一般情况,当一行接一行地打印某个内容时,希望能够在CIL中暂停: 自身得分=[0,0] def playGameself: 如果self.server==True:self.server在有人调用playGame时为True或False server=self.player\u 1.get\u win\u serve self.player\u 1=类玩家的对象: 其他: server=self.player\u 2.get\u win\u serve get\u win\u serve方法返回赢得其发球1-0的概率 当0在Windows中暂停并恢复Python 3.42中正在运行的脚本,python,Python,我是Python新手,已经在谷歌上搜索了几天,阅读了我在这个论坛上找到的所有内容。也许我不完全理解,但我还没有找到解决问题的办法。已经请求原谅如果我的问题已经有了答案,那么我还没有理解它 我想为我的程序Tennismatch创建一个暂停函数。该程序将在运行时打印网球比赛的分数,如下所示:15-0、15-15等,直到比赛结束。它将逐行打印分数 我希望用户能够在x个球数、游戏数等之后暂停。因此,我不知道用户何时想暂停,在用户暂停后,我希望用户能够在原来的位置恢复tennismatch 我已经看到了时
通过调用一个我还没有编写的score函数来打印“score”我得出了以下结论
while True:
try:
## Keep doing something here
## your regular code
print '.',
except KeyboardInterrupt:
## write or call pause function which could be time.sleep()
print '\nPausing... (Hit ENTER to continue, type quit to exit.)'
try:
response = raw_input()
if response.lower() == 'quit':
break
print 'Quitting...'
except KeyboardInterrupt:
print 'Resuming...'
continue
为了处理主循环中的事件,您需要创建一个单独的线程来捕获输入或任何其他事件
import sys
from sys import stdin
from time import sleep
from threading import Thread
from Queue import Queue, Empty
def do_something():
sleep(1)
print 42
def enqueue_output(queue):
while True:
# reading line from stdin and pushing to shared queue
input = stdin.readline()
print "got input ", input
queue.put(input)
queue = Queue()
t = Thread(target=enqueue_output, args=(queue,))
t.daemon = True
t.start()
pause = False
try:
while True:
try:
command = queue.get_nowait().strip()
print 'got from queue ', command
except Empty:
print "queue is empty"
command = None
if command:
if command == 'p':
pause = True
if command == 'u':
pause = False
if not pause:
print pause
do_something()
except KeyboardInterrupt:
sys.exit(0)
事件循环也可能是我用它编写的代码
我没有看到任何用户输入,所以我假设x模拟了它。若要在x<0.1时暂停游戏,若x>0.9时取消暂停/恢复游戏,您可以:
while your_condition(self.__points):
x = random.random()
if x < 0.1: # pause
self.pause()
elif x > 0.9: # resume
self.resume()
if self.is_paused:
continue # do nothing else only wait for input (`x`)
# assume your_condition() has no side-effects
# here's what the resumed version does:
print("...")
# change self.__points, etc
正如您所看到的,实现非常简单。您应该向我们展示您的代码,最好是说明您的问题的简化版本,这样我们就可以清楚地理解您所说的内容。FWIW,在CLI程序中实现暂停/延迟通常使用与GUI程序中所需策略稍有不同的策略。但我想,如果您了解如何使用CLI版本,那么使用GUI版本可能会更容易。这是非常重要的。基本上,您需要连续循环,以非阻塞的方式从用户处读取击键,并且仅当已读取击键时,才在程序中切换内部暂停状态。但是,以非阻塞方式(无需使用多线程)敲击单个键盘是非常特定于平台的。我已经添加了一些代码,到目前为止,我已经添加了这些代码。您应该从更基本的事情开始,例如在运行游戏时如何接受用户输入的键盘/鼠标。一旦你知道了这一点;添加暂停/恢复方法很简单。例如,看看pygame框架是如何实现的。我如何在Shell(CLI)中实现accept input?我的计划是以后使用tkinter作为GUI。我知道这在GUI中更容易实现,但我的任务是在GUI和CLI中实现。@Tennisfan实际上time.sleeps不与键盘中断或您所说的按键连接。它只是暂停程序执行几秒钟。@d-coder-1因为time.sleep绝对不适合OP的用途。他想实现一个由按键启动和终止的暂停/取消暂停机制,而不是在预先知道的给定时间内暂停。我知道输入是这样工作的。但是,我必须在暂停之后和暂停之前都有一个代码,与whit time.sleep完全相同,因为我不知道用户何时想要暂停,所以我没有这个代码。删除了my-1,因为这实际上是一种工作方式。不过也有一些严重的缺点:您仅限于将暂停操作绑定到KeyboardInterrupt CTRL+C,例如,您不可能使用此方法将其绑定到p键。正因为如此,您还可以像往常一样,消除使用CTRL+C终止程序的可能性。您可以编写应该一直发生的内容,直到出现键盘中断。若用户在程序执行时按下某个按钮,那个么它将停止给出该消息。接下来,如果用户按quit,则编写退出脚本的代码,否则请编写恢复脚本后应发生的代码,我理解这一点,并且在其他TA中可能有用
在本例中,根据x设置条件时,ks是您提到的。但它应该保持打印分数,与x的值无关。但感谢您在更容易决定是否暂停的情况下显示实现PauseFunction。那么continue只返回循环的开头,对吗?@Tennisfan:是的,continue跳过循环的其余部分。它应该独立于x的值打印-在您的情况下,暂停意味着什么?我假设这意味着在游戏暂停时,不应打印或重新计算分数。注意:x只是用户输入的一个占位符。在实际的程序中,应该使用一些事件而不是x,例如:用户按下键盘上的“p”键。关于暂停的工作方式,您是正确的。不过,我有一些误解,因为我在代码中使用了一个变量x,它不会影响最终的暂停条件。
def __init__(self):
self.is_paused = False
def pause(self):
self.is_paused = True
def resume(self):
self.is_paused = False