وقفة لانهائية في حين حلقة مع ضغطة واحدة

أنا جديد على python ولقد حاولت إيجاد طريقة بسيطة لإيقاف تشغيل حلقة أثناء التشغيل ، مما يجعل من الممكن تشغيلها مرة أخرى من حيث تم إيقافها مؤقتًا. لقد بحثت في Google للحصول على المساعدة والنصائح ، ولكن كل ما أجده يبدو معقدًا للغاية. هل هناك طريقة بسيطة للقيام بذلك؟

لقد قرأت أنه يمكنك استخدام termios و tkinter.

ايم باستخدام أوبونتو.

آسف لأخطاء اللغة

شكر!

2
stackoverflow.com/questions/368545/how-can-i-stop-a-while-lo & zwnj؛ op هذا سؤال مكرر محتمل ، ألقِ نظرة
وأضاف المؤلف doniyor, مصدر
doniyor: الإيقاف المؤقت ليس تمامًا مثل التوقف.
وأضاف المؤلف Junuxx, مصدر

4 إجابة

لا حول كيفية القيام بذلك باستخدام ضغطة واحدة ، ولكن لاستئناف حلقة مؤقت وإيقافها مؤقتًا ، يمكنك استخدام وظائف المولد ، انظر المثال التالي:

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
1
وأضاف
تمام شكرا! الشيء هو فقط أريد أن أكون قادرا على وقفة في أي وقت معين كما هو looping.
وأضاف المؤلف fatninja, مصدر
حسناً ، آسف على أسئلتي الغبية ^ ^ هل يمكن أن يكون ذلك ممكناً مع وظيفة مماثلة تجعله حتى أتمكن من إيقافها مؤقتًا في وقت عشوائي حيث إنها تعمل في الواقع؟ دون وجود مكان معين يجب أن يتوقف مؤقتا ويستأنف؟
وأضاف المؤلف fatninja, مصدر
@ user1488138 هذا ما تقوم به وظيفة المولد ، يمكنهم إيقاف التنفيذ ويمكنهم بدء التنفيذ حيث غادروا.
وأضاف المؤلف Ashwini Chaudhary, مصدر
@ Ashwini: هذا لا يبدو أن تفعل ما طلب البروتوكول الاختياري على الإطلاق. كيف يمكن للمستخدم إيقاف العملية مؤقتًا؟
وأضاف المؤلف Junuxx, مصدر

إليك برنامج tkinter بسيط يعمل في حلقة لا نهائية. يؤدي الضغط على مسافة إلى الإيقاف المؤقت/الإيقاف المؤقت ، ثم الضغط على Esc .

ملاحظة: ما يلي هو Python 2.x ، إذا كنت تستخدم Python 3 ، فقم بتغيير Tkinter في السطر الأول إلى tkinter (lower case 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("", self.switch)
        self.root.bind("", 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()

هذا ناتج محتمل ، حيث أوقفت البرنامج مؤقتًا وأوقف تشغيله مؤقتًا مرتين قبل أن أغادر.

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
1
وأضاف
شكرا جزيلا ، هذا ما كنت أبحث عنه! :)
وأضاف المؤلف fatninja, مصدر

المتأنق انها حلقة في حين ... لا تشغيله في حلقة في حين ، والتي من شأنها أن تمنع وحدة المعالجة المركزية ، مجرد محاولة استخدام الموقتات ...

في ما يلي مثال ثعبان 3 للحصول على الإدخال من نافذة لا يتم عرضها ، واختبارها على OSX و Linux Ubuntu و Windows 8

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("", 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()

يمكنك شكر @ سارانيان على هذا ...

0
وأضاف
يا btw ربما يجب self.root.focus_set() داخل أسلوب update_clock ، ولحفظ العدد لديك حساب أو بيانات كما هو موضح في var في init ، ولكن يتم تحديثه فقط (self.state == ' توقف '):
وأضاف المؤلف Lewis Richard Phillip Cowles, مصدر

لقد بحثت إلى الأبد عن هذا الحل ، ولكن تبين أنه بسيط للغاية. أنا جميلة فقط وحدة نمطية تعمل فقط على أنظمة يونكس ، لكنها جعلت الأمور سهلة حقا.

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
0
وأضاف