मुझे किवी लाइब्रेरी में बटन अक्षम करने में समस्या है। जब मैं बटन अक्षम करता हूं, तो यह बस अक्षम नहीं होता है। यह किसी अजीब तरीके से इंतजार कर रहा है।
मैं आपको अपना कोड दिखाता हूं:
import kivy
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
import time
class MainApp(App):
def build(self):
self.l = FloatLayout()
b = Button(text="BUTTON", pos_hint={"top":0.8, "right": 0.8}, size_hint=(0.6, 0.6))
b.bind(on_press=self.press)
self.l.add_widget(b)
return self.l
def press(self, btn):
btn.disabled = True
time.sleep(3.0)
btn.disabled = False
app = MainApp()
app.run()
जब मैं बटन दबाता हूं, तो मैं इसे 3 सेकंड के लिए अक्षम करना चाहता हूं। लेकिन इसके बजाय प्रोग्राम "फ्रीज" (बटन को अक्षम किए बिना), और फिर 3 सेकंड के बाद प्रेस का एनीमेशन करें (बटन नीले रंग से ब्लिंक करता है)। बेशक प्रोग्राम को समय के कारण "फ्रीज" करना चाहिए। नींद (3.0), लेकिन बटन को अक्षम करने के बाद (जो ग्रे होना चाहिए, लेकिन यह रंग नहीं बदलता है ...)
इसे कैसे हल करें? अगर मैं प्रोग्राम द्वारा "कुछ करने" की नकल करने के लिए समय। नींद () की तरह कुछ चक्र (लगभग 10 मिलियन चक्र के साथ) डालता हूं, तो यह उसी तरह से व्यवहार करता है ...
तो मैं इसे कैसे हल कर सकता हूं? कीवी में बटन को कैसे निष्क्रिय करें, फिर कुछ करें और उसके बाद फिर से बटन को सक्षम करें?
धन्यवाद!
संपादित करें: मेरी समस्या यह नहीं है कि वह प्रोग्राम 3 सेकंड के लिए फ़्रीज हो जाता है। मैं समझता हूं कि कॉलिंग टाइम.स्लीप () ब्लॉक हो रही है। मुझे समझ में नहीं आता कि सोने से पहले (और उसके दौरान) बटन अक्षम क्यों नहीं है ...
2 जवाब
time.sleep
कोड को ब्लॉक कर रहा है। इसके बजाय आपको 3 सेकंड के बाद बटन को सक्षम करने के लिए Clock
का उपयोग करना होगा। अपने लक्ष्य को प्राप्त करने के लिए सही कोड नीचे दिया गया है:
import kivy
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.clock import Clock
from functools import partial
class MainApp(App):
def build(self):
self.l = FloatLayout()
b = Button(text="BUTTON", pos_hint={"top":0.8, "right": 0.8}, size_hint=(0.6, 0.6))
b.bind(on_press=self.press)
self.l.add_widget(b)
return self.l
def press(self, btn):
btn.disabled = True
Clock.schedule_once(partial(self.btn_enable, btn), 3)
def btn_enable(self, btn, *args):
btn.disabled = False
app = MainApp()
app.run()
टीएल; डॉ
एनिमेशन बाद होता है press
फ़ंक्शन को कॉल किया जाता है। इसका मतलब है कि time.sleep
करते समय आप प्रोग्राम को फ्रीज कर दें।
इसके बारे में क्या करना है?
इसके बजाय, आपको कुछ गैर-अवरुद्ध करने की ज़रूरत है, जिसका अर्थ है कि यह तीन सेकंड में चलता है, लेकिन यह प्रोग्राम को स्थिर नहीं करता है। कुछ ऐसा जो शायद काम करेगा, वह है थ्रेड्स का उपयोग करना (उदाहरण के समान कुछ, लेकिन थ्रेड्स में वेरिएबल भेजने से निपटना)।
उदाहरण
यहां आपके कोड के लिए एक उदाहरण दिया गया है जो नहीं काम करता है, ताकि आप इसका सार समझ सकें। सबसे अधिक संभावना है, आपको धागे में गुजरने वाले चर से निपटना होगा:
import kivy
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
# import time
import threading
class MainApp(App):
def build(self):
self.l = FloatLayout()
b = Button(text="BUTTON", pos_hint={"top":0.8, "right": 0.8}, size_hint=(0.6, 0.6))
b.bind(on_press=self.press)
self.l.add_widget(b)
return self.l
def press(self, btn):
btn.disabled = True
# time.sleep(3.0)
threading.Timer(3.0, lambda: btn.disabled = False).start()
app = MainApp()
app.run()
यह इस उत्तर से प्रेरित था।
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।