2012-03-19 14 views
6

मुझे 'फ़ीड' को रोकने में समस्या आ रही है; रद्द करने का तर्क बाद के तरीके पर कोई प्रभाव नहीं प्रतीत होता है। हालांकि "फीड रुक गया" कंसोल पर मुद्रित है।मैं फ़ंक्शन के बाद टिंकर को कैसे रोकूं?

मैं एक बटन रखने का प्रयास कर रहा हूं जो फ़ीड शुरू करेगा और दूसरा फ़ीड को रोक देगा।

from Tkinter import Tk, Button 
import random 

    def goodbye_world(): 
     print "Stopping Feed" 
     button.configure(text = "Start Feed", command=hello_world) 
     print_sleep(True) 

    def hello_world(): 
     print "Starting Feed" 
     button.configure(text = "Stop Feed", command=goodbye_world) 
     print_sleep() 

    def print_sleep(cancel=False): 
     if cancel==False: 
      foo = random.randint(4000,7500) 
      print "Sleeping", foo 
      root.after(foo,print_sleep) 
     else: 
      print "Feed Stopped" 


    root = Tk() 
    button = Button(root, text="Start Feed", command=hello_world) 

    button.pack() 


    root.mainloop() 
उत्पादन के साथ

:

Starting Feed 
Sleeping 4195 
Sleeping 4634 
Sleeping 6591 
Sleeping 7074 
Stopping Feed 
Sleeping 4908 
Feed Stopped 
Sleeping 6892 
Sleeping 5605 
+0

मुझे पूरी तरह से यकीन नहीं है कि कैसे काम करता है, लेकिन यह मुझे थ्रेडिंग मुद्दे की तरह दिखता है। यदि आप वैश्विक (थ्रेड सुरक्षित) वैश्विक को रद्द करते हैं, तो क्या इससे समस्या हल हो जाती है? – mklauber

+0

@mklauber: नहीं, थ्रेडिंग समस्या नहीं। टिंकर एकल-थ्रेडेड है। –

+0

@ ब्रायन ओक्ले: धन्यवाद। यही कारण है कि मैंने एक टिप्पणी के रूप में पोस्ट किया। मुझे यकीन नहीं था इसलिए मैं सिर्फ सवाल उठाना चाहता था। – mklauber

उत्तर

13

समस्या यह है कि, यदि आप चक्र को रोकने के लिए के साथ print_sleep पर कॉल कर रहे हैं, तो पहले से ही एक लंबित नौकरी आग लगने का इंतजार कर रही है। स्टॉप बटन दबाकर एक नई नौकरी आग लगने का कारण नहीं बनता है, लेकिन पुरानी नौकरी अभी भी वहां है, और जब यह स्वयं कॉल करती है, तो यह गलत में गुजरती है जो लूप को जारी रखने का कारण बनती है।

आपको लंबित नौकरी को रद्द करने की आवश्यकता है ताकि यह नहीं चल सके। उदाहरण के लिए:

def cancel(): 
    if self._job is not None: 
     root.after_cancel(self._job) 
     self._job = None 

def goodbye_world(): 
    print "Stopping Feed" 
    cancel() 
    button.configure(text = "Start Feed", command=hello_world) 

def hello_world(): 
    print "Starting Feed" 
    button.configure(text = "Stop Feed", command=goodbye_world) 
    print_sleep() 

def print_sleep(): 
    foo = random.randint(4000,7500) 
    print "Sleeping", foo 
    self._job = root.after(foo,print_sleep) 

नोट: सुनिश्चित करें कि आप इस तरह के अपने आवेदन वस्तु के निर्माता के रूप में कहीं self._job प्रारंभ, बनाते हैं।

13

जब आप root.after(...) कहते हैं, यह एक पहचानकर्ता वापस आ जाएगी। आपको उस पहचानकर्ता का ट्रैक रखना चाहिए (उदा।, इसे एक आवृत्ति चर में संग्रहीत करें), और उसके बाद आप इसे रद्द करने के लिए बाद में root.after_cancel(after_id) पर कॉल कर सकते हैं।

संबंधित मुद्दे