首页 > 解决方案 > 无法在 Kivy (Python) 中禁用按钮

问题描述

我在禁用 kivy 库中的按钮时遇到问题。当我禁用按钮时,它根本不会禁用。它以某种奇怪的方式等待。

让我向您展示我的代码:

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 秒后做按下动画(按钮闪烁蓝色)。由于 time.sleep(3.0) 的原因,程序必须“冻结”,但是在禁用按钮之后(它必须是灰色的,但它不会改变颜色......)

如何解决?如果我把 time.sleep() 放在那里代替循环(大约有 1000 万个循环)来模仿程序“做某事”,它的行为方式相同......

那么我该如何解决呢?如何禁用kivy中的按钮,然后做某事并在完成后再次启用按钮?

谢谢!

编辑:我的问题不是,该程序冻结了 3 秒。我知道调用 time.sleep() 是阻塞的。我不明白为什么按钮在睡眠之前(和期间)没有被禁用......

标签: pythonpython-3.xuser-interfacekivy

解决方案


time.sleep正在阻止代码。相反,您需要Clock在 3 秒后使用来启用按钮。以下是实现目标的更正代码:

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

推荐阅读