2

私はPythonを初めて使用し、動作中のwhileループを一時停止して、一時停止した場所から再開できるようにする簡単な方法を見つけようとしています。Google でヘルプとヒントを検索しましたが、見つけたものはすべて非常に複雑に思えます。これを行う簡単な方法はありますか?

termios と tkinter を使用できると読みました。

Ubuntuを使用しています。

言葉の間違いごめんなさい

ありがとう!

4

4 に答える 4

2

これは、無限ループで実行される単純な tkinter プログラムです。を押すとspace一時停止/再開し、 を押すとEsc終了します。

注: 以下は Python 2.x の場合です。Python 3 を使用している場合はTkinter、最初の行をtkinter(小文字の t) に変更します。

from Tkinter import *
import time

class MyLoop():
    def __init__(self, root):
        self.running = True
        self.aboutToQuit = False
        self.root = root
        self.someVar = 0
        self.root.bind("<space>", self.switch)
        self.root.bind("<Escape>", self.exit) 

        while not self.aboutToQuit:
            self.root.update() # always process new events

            if self.running:
                # do stuff
                self.someVar += 1
                print(self.someVar)
                time.sleep(.1)

            else: # If paused, don't do anything
                time.sleep(.1)

    def switch(self, event):
        print(['Unpausing','Pausing'][self.running])
        self.running = not(self.running)

    def exit(self, event):
        self.aboutToQuit = True
        self.root.destroy()

if __name__ == "__main__":
    root = Tk()
    root.withdraw() # don't show the tkinter window
    MyLoop(root)
    root.mainloop()

これは、終了する前にプログラムを 2 回手動で一時停止および再開した場合の出力の可能性です。

1
2
3
4
5
6
7
Pausing
Unpausing
8
9
10
11
12
13
14
15
16
Pausing
Unpausing
17
18
19
20
21
22
23
24
25
于 2012-06-28T12:12:44.873 に答える
1

単一のキープレスでそれを行う方法についてではなく、使用できる while ループを再開および一時停止するgenerator functionsには、以下の例を参照してください。

i=-1
def infi():
   global i
   while i<99999999:
       i+=1
       yield i

a=iter(infi())

for x in range(6):
    print(next(a))
#loop paused at 5     
print('now it wil start from start 6')

for x in range(11):
    print(next(a))

出力:

0
1
2
3
4
5
now it wil start from start 6
6
7
8
9
10
11
12
13
14
15
16
于 2012-06-28T10:13:39.783 に答える
0

私はこの解決策を永遠に探しましたが、それは本当に簡単であることがわかりました. select モジュールは Unix システムでしか動作しませんが、非常に簡単になりました。

import sys
import select
inputSrc = [sys.stdin]

while True:

    # Do important stuff

    # Check if a key was pressed and if so, process input
    keypress = select.select(inputSrc, [], [], 0)[0]
    while keypress:
        for src in keypress:
            line = src.readline()
            if not line:
                inputSrc.remove(src)
            else:
                # The "enter" key prints out a menu
                if line == "\n":
                    print "Test Paused\nOptions: [0]: Quit  [any other key]: Resume"
                elif line.rstrip() == "0":
                    exit(0)
                elif len(line) >= 1: #any other key
                    print "Resuming..."
                    keypress = None
于 2016-02-09T23:03:36.077 に答える
0

おい、それはwhileループです... whileループで実行しないでください。CPUをブロックします。タイマーを使用してみてください...

これは、OSX、Linux Ubuntu、および Windows 8 でテストされた、表示されていないウィンドウから入力を取得する Python 3 の例です。

import tkinter as tk
import time

class App():
    def __init__(self):
        self.state = 'running'
        self.cnt = 0
        self.root = tk.Tk()
        self.update_clock()
        self.root.bind("<Key>", self.key)
        self.root.geometry('1x1+9000+9000')
        self.root.mainloop()

    def update_clock(self):
        now = time.strftime("%H:%M:%S")
        self.root.after(100, self.update_clock)
        self.root.focus_set()
        if(self.state == 'running'):
            self.cnt = self.cnt + 1
        if(self.cnt <= 100):
            print('state: ',self.state,' count:',self.cnt,'%')
        else:
            exit()

    def key(self,event):
        self.root.focus_force()
        if(event.keysym == 'Escape'):
            self.state = 'paused'
        elif(event.keysym == 'space'):
            self.state = 'running'
        print("pressed", repr(event.keysym))
        print("state",self.state)
app=App()
app.mainloop()

これについて@saranyanに感謝できます...

于 2013-06-01T20:10:01.787 に答える