python - 无法在 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() 是阻塞的。我不明白为什么按钮在睡眠之前(和期间)没有被禁用......
解决方案
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()
推荐阅读
- javascript - 使用 Jquery 删除方法
- javascript - 在给定字符串中用 --[character]-- 替换某些字符的出现的函数
- c - 如何使用信号量 API 函数来执行正确的锁定/锁定?
- android-fragments - android导航不显示片段
- java - 如何在 okhttp 上添加证书
- windows - 批处理文件中未设置 https_proxy 变量
- python - 如何解决安装 web3.py 时出现的错误
- angular - 角度放置请求状态代码和对象分配
- bash - sendemail 附件来自 - 如果存在 - 变量
- mysql - ERROR 1146 (42S02): 调用存储过程时表 'mysql.proc' 不存在