मुझे किवी लाइब्रेरी में बटन अक्षम करने में समस्या है। जब मैं बटन अक्षम करता हूं, तो यह बस अक्षम नहीं होता है। यह किसी अजीब तरीके से इंतजार कर रहा है।

मैं आपको अपना कोड दिखाता हूं:

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 सेकंड के लिए फ़्रीज हो जाता है। मैं समझता हूं कि कॉलिंग टाइम.स्लीप () ब्लॉक हो रही है। मुझे समझ में नहीं आता कि सोने से पहले (और उसके दौरान) बटन अक्षम क्यों नहीं है ...

0
Petr Marek 28 अगस्त 2020, 20:49

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()
1
amras 28 अगस्त 2020, 21:58

टीएल; डॉ

एनिमेशन बाद होता है 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()

यह इस उत्तर से प्रेरित था।

0
Max Larsson 28 अगस्त 2020, 21:38