2010-10-19 4 views
6

मैं अपने विज़ुअलाइज़ेशन को अपडेट करने के लिए स्लाइडर का उपयोग कर रहा हूं, लेकिन कमांड अपडेट वैल्यू हर बार जब मैं स्लाइडर अंगूठे को ले जाता हूं, इंटरमीडिएट वैल्यू के लिए भी भेजता हूं।TkInter, स्लाइडर: इटैरेक्शन पूरा होने पर केवल ईवेंट को ट्रिगर कैसे करें?

इसके बजाय मैं इसे केवल तब ट्रिगर करना चाहता हूं जब मैं माउस बटन जारी करता हूं और बातचीत पूर्ण हो जाती है।

self.slider = tk.Scale(self.leftFrame, from_=0, to=256, orient=tk.HORIZONTAL, command=updateValue) 

इंटरैक्शन समाप्त होने पर, मैं केवल एक बार फ़ंक्शन को कैसे ट्रिगर कर सकता हूं?

उत्तर

4

आप नहीं कर सकते।

इसके बजाय आप क्या कर सकते हैं इसके बाद 'आदेश' का उपयोग करके थोड़े समय के लिए कोई भी वास्तविक कार्य देरी हो सकती है। प्रत्येक बार जब आपका आदेश कहा जाता है, तो किसी लंबित कार्य को रद्द करें और कार्य को फिर से निर्धारित करें। आपकी वास्तविक आवश्यकताओं के आधार पर, आधा दूसरी देरी पर्याप्त हो सकती है।

एक और विकल्प अंतर्निहित कमांड सुविधा का उपयोग नहीं करना है और इसके बजाय कस्टम बाइंडिंग का उपयोग करना है। यह बिल्कुल सही होने के लिए बहुत काम हो सकता है, लेकिन यदि आपको वास्तव में अच्छी तरह से दाग नियंत्रण की आवश्यकता है तो आप इसे कर सकते हैं। यह न भूलें कि माउस के अलावा कीबोर्ड का उपयोग करके विजेट से बातचीत कर सकते हैं।

import Tkinter as tk 

#create window & frames 
class App: 
    def __init__(self): 
     self.root = tk.Tk() 
     self._job = None 
     self.slider = tk.Scale(self.root, from_=0, to=256, 
           orient="horizontal", 
           command=self.updateValue) 
     self.slider.pack() 
     self.root.mainloop() 

    def updateValue(self, event): 
     if self._job: 
      self.root.after_cancel(self._job) 
     self._job = self.root.after(500, self._do_something) 

    def _do_something(self): 
     self._job = None 
     print "new value:", self.slider.get() 

app=App() 
+0

ठीक है, 0.5 देरी होने का सबसे अच्छा तरीका क्या है? – aneuryzm

+0

@ पैट्रिक: मैंने उदाहरण को संपादित करने के लिए उत्तर संपादित किया है –

+0

धन्यवाद, मुझे यह त्रुटि मिलती है: विशेषता त्रुटि: 'str' ऑब्जेक्ट में कोई विशेषता नहीं है '_job' – aneuryzm

16

यह अब काफी एक प्राचीन सवाल है, लेकिन इस मामले में किसी को भी ठोकर पर इस विशेष समस्या सिर्फ बाँध का उपयोग करें:

यहाँ एक छोटी शेड्यूल करने का तरीका काम आधे सेकंड में किया जाना दिखा उदाहरण है() फ़ंक्शन और "बटन रिलीज -1" ईवेंट की तरह:

import Tkinter as tk 

class App: 
    def __init__(self): 
     self.root = tk.Tk() 

     self.slider = tk.Scale(self.root, from_=0, to=256, 
           orient="horizontal") 
     self.slider.bind("<ButtonRelease-1>", self.updateValue) 
     self.slider.pack() 
     self.root.mainloop() 

    def updateValue(self, event): 
     print self.slider.get() 

app=App() 

आशा है कि इससे किसी की भी मदद मिलेगी!

+0

मुझे पता है कि यह एक ईश्वरीय प्रश्न का उत्तर है, लेकिन यह वही जवाब था जिसे मैं ढूंढ रहा था। धन्यवाद। – mhourdakis

+2

सावधान रहें! यदि Scale.takefocus सत्य है, तो लोग केवल कीबोर्ड तीर कुंजियों का उपयोग करके स्लाइडर को स्थानांतरित करने में सक्षम होंगे। ** लेकिन कुछ भी नहीं होगा ** क्योंकि आप केवल माउस क्लिक को पकड़ रहे हैं। उपाय करने के लिए, मुख्य प्रेस भी पकड़ें। (आप एकल कॉलबैक के लिए कई ईवेंट बाध्य कर सकते हैं) – AneesAhmed777

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