Kivy 无法更新操作按钮图标
Kivy Unable to Update the action button Icon
我正在用 raspberry pi 模块构建一个 Kivy 界面。不幸的是,当以太网断开连接时我无法更改图标 bar.I 当以太网电缆连接时已经分配了一个图标但是当断开连接时它不会更新我的资产中的图标 folder.Basically 应用程序在我使用时工作在 Kivy 文件上一遍又一遍地使用相同的图标。(EE1.png 和 mm.png)。
class Menu(BoxLayout):
manager = ObjectProperty(None)
def __init__(self, **kwargs):
super(Menu, self).__init__(**kwargs)
Window.bind(on_keyboard=self._key_handler)
logger.setErrorIcon = self.setErrorIcon
#btn1 = ActionButton(text='',icon='./assest/usb.jpg')
def _key_handler(self, instance, key, *args):
if key is 27:
self.set_previous_screen()
return True
def is_connected(self, *args):
motorBtn = StringProperty()
index = NumericProperty(-1)
try
socket.create_connection(("www.google.com", 80))
self.ids.EthBtn.icon = './Asset/EE1.png'
logger.debug("connected")
except OSError:
self.ids.EthBtn.icon = './Asset/EE.png'<<<<This Icon doesnt shows
logger.error("E81:not connected")
ActionBar:
size_hint_y: 0.15
background_image: ''
background_color: 0.349, 0.584, 0.917, 1
ActionView:
ActionPrevious:
id: actprev
title: "[b]RheoSB[/b]"
markup: True
##color: 0.105, 0.109, 0.113,1
font_size: 100
#app_icon: './assest/v3.jpg'
app_icon: './Asset/VL2.png'
with_previous: False
##on_release: root.set_previous_screen()
#on_press: root.manager.current= 'home'
on_press: root.set_previous_screen()
on_press: root.btn_SwipeSound()
ActionButton:
id:errorBtn
text:''
icon: ''
on_press:root.error_logPopup()
ActionButton:
id:EthBtn
important: True
text:''
icon: './Asset/EE1.png'<<<<<
ActionButton:
id:motorBtn
text:''
icon: './Asset/mm.png'
但是当我改变
except OSError:
self.ids.EthBtn.icon = './Asset/EE.png'
至
`except OSError:
self.ids.EthBtn.icon = './Asset/mm.png'`
它显示 mm.png 图标。
编辑
而不是
class MenuApp(App):
index = NumericProperty(-1)
def build(self):
my_callback = Menu()
Clock.schedule_interval(my_callback.is_connected, 0.5)
return my_callback # Menu()
我使用 *BackgroundScheduler()*
回调 *is_connected()*
方法,这导致了我的问题。你能解释一下为什么会这样吗!!
class MenuApp(FlatApp):
def build(self):
my_callback=Menu()
scheduler = BackgroundScheduler()
scheduler.add_job(my_callback.is_connected, 'interval', seconds=1)
#scheduler.add_job(ip_call.update_ip, 'interval', seconds=1)
scheduler.start()
return my_callback
编辑编辑
https://apscheduler.readthedocs.io/en/latest/userguide.html#basic-concepts
https://apscheduler.readthedocs.io/en/latest/modules/schedulers/background.html#apscheduler.schedulers.background.BackgroundScheduler
在代码中 from apscheduler.schedulers.background import BackgroundScheduler
我只是导入库并开始使用它。以前没想过用kivy clock schedule..
它适用于下面的示例。测试环境为笔记本电脑和WiFi/WLAN(无线局域网)。
例子
main.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import NumericProperty, ObjectProperty, StringProperty
from kivy.core.window import Window
from kivy.clock import Clock
import socket
from kivy.lang import Builder
from kivy.logger import Logger
class Menu(BoxLayout):
manager = ObjectProperty(None)
def __init__(self, **kwargs):
super(Menu, self).__init__(**kwargs)
Window.bind(on_keyboard=self._key_handler)
# Logger.setErrorIcon = self.setErrorIcon
def _key_handler(self, instance, key, *args):
if key is 27:
self.set_previous_screen()
return True
def is_connected(self, *args):
motorBtn = StringProperty()
index = NumericProperty(-1)
try:
socket.create_connection(("www.google.com", 80))
self.ids.EthBtn.icon = './Asset/EE1.png'
Logger.debug("connected")
except OSError:
self.ids.EthBtn.icon = './Asset/EE.png'
Logger.error("E81:not connected")
Builder.load_file('main.kv')
class MenuApp(App):
index = NumericProperty(-1)
def build(self):
my_callback = Menu()
Clock.schedule_interval(my_callback.is_connected, 0.5)
return my_callback # Menu()
if __name__ == '__main__':
MenuApp().run()
main.kv
<Menu>:
canvas.before:
Rectangle:
pos: self.pos
size: self.size
manager: screen_manager
orientation: "vertical"
ActionBar:
size_hint_y: 0.15
background_image: ''
background_color: 0.349, 0.584, 0.917, 1
ActionView:
ActionPrevious:
id: actprev
title: "[b]RheoSb[/b]"
markup: True
##color: 0.105, 0.109, 0.113,1
font_size: 100
#app_icon: './assest/v3.jpg'
app_icon: './Asset/VL2.png'
with_previous: False
##on_release: root.set_previous_screen()
#on_press: root.manager.current= 'home'
on_press: root.set_previous_screen()
on_press: root.btn_SwipeSound()
ActionButton:
id:errorBtn
text:''
icon: ''
on_press:root.error_logPopup()
ActionButton:
id:EthBtn
important: True
text:''
icon: './Asset/EE1.png'
ActionButton:
id:motorBtn
text:''
icon: './Asset/mm.png'
ScreenManager:
id: screen_manager
输出
我正在用 raspberry pi 模块构建一个 Kivy 界面。不幸的是,当以太网断开连接时我无法更改图标 bar.I 当以太网电缆连接时已经分配了一个图标但是当断开连接时它不会更新我的资产中的图标 folder.Basically 应用程序在我使用时工作在 Kivy 文件上一遍又一遍地使用相同的图标。(EE1.png 和 mm.png)。
class Menu(BoxLayout):
manager = ObjectProperty(None)
def __init__(self, **kwargs):
super(Menu, self).__init__(**kwargs)
Window.bind(on_keyboard=self._key_handler)
logger.setErrorIcon = self.setErrorIcon
#btn1 = ActionButton(text='',icon='./assest/usb.jpg')
def _key_handler(self, instance, key, *args):
if key is 27:
self.set_previous_screen()
return True
def is_connected(self, *args):
motorBtn = StringProperty()
index = NumericProperty(-1)
try
socket.create_connection(("www.google.com", 80))
self.ids.EthBtn.icon = './Asset/EE1.png'
logger.debug("connected")
except OSError:
self.ids.EthBtn.icon = './Asset/EE.png'<<<<This Icon doesnt shows
logger.error("E81:not connected")
ActionBar:
size_hint_y: 0.15
background_image: ''
background_color: 0.349, 0.584, 0.917, 1
ActionView:
ActionPrevious:
id: actprev
title: "[b]RheoSB[/b]"
markup: True
##color: 0.105, 0.109, 0.113,1
font_size: 100
#app_icon: './assest/v3.jpg'
app_icon: './Asset/VL2.png'
with_previous: False
##on_release: root.set_previous_screen()
#on_press: root.manager.current= 'home'
on_press: root.set_previous_screen()
on_press: root.btn_SwipeSound()
ActionButton:
id:errorBtn
text:''
icon: ''
on_press:root.error_logPopup()
ActionButton:
id:EthBtn
important: True
text:''
icon: './Asset/EE1.png'<<<<<
ActionButton:
id:motorBtn
text:''
icon: './Asset/mm.png'
但是当我改变
except OSError:
self.ids.EthBtn.icon = './Asset/EE.png'
至
`except OSError:
self.ids.EthBtn.icon = './Asset/mm.png'`
它显示 mm.png 图标。
编辑 而不是
class MenuApp(App):
index = NumericProperty(-1)
def build(self):
my_callback = Menu()
Clock.schedule_interval(my_callback.is_connected, 0.5)
return my_callback # Menu()
我使用 *BackgroundScheduler()*
回调 *is_connected()*
方法,这导致了我的问题。你能解释一下为什么会这样吗!!
class MenuApp(FlatApp):
def build(self):
my_callback=Menu()
scheduler = BackgroundScheduler()
scheduler.add_job(my_callback.is_connected, 'interval', seconds=1)
#scheduler.add_job(ip_call.update_ip, 'interval', seconds=1)
scheduler.start()
return my_callback
编辑编辑 https://apscheduler.readthedocs.io/en/latest/userguide.html#basic-concepts https://apscheduler.readthedocs.io/en/latest/modules/schedulers/background.html#apscheduler.schedulers.background.BackgroundScheduler
在代码中 from apscheduler.schedulers.background import BackgroundScheduler
我只是导入库并开始使用它。以前没想过用kivy clock schedule..
它适用于下面的示例。测试环境为笔记本电脑和WiFi/WLAN(无线局域网)。
例子
main.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import NumericProperty, ObjectProperty, StringProperty
from kivy.core.window import Window
from kivy.clock import Clock
import socket
from kivy.lang import Builder
from kivy.logger import Logger
class Menu(BoxLayout):
manager = ObjectProperty(None)
def __init__(self, **kwargs):
super(Menu, self).__init__(**kwargs)
Window.bind(on_keyboard=self._key_handler)
# Logger.setErrorIcon = self.setErrorIcon
def _key_handler(self, instance, key, *args):
if key is 27:
self.set_previous_screen()
return True
def is_connected(self, *args):
motorBtn = StringProperty()
index = NumericProperty(-1)
try:
socket.create_connection(("www.google.com", 80))
self.ids.EthBtn.icon = './Asset/EE1.png'
Logger.debug("connected")
except OSError:
self.ids.EthBtn.icon = './Asset/EE.png'
Logger.error("E81:not connected")
Builder.load_file('main.kv')
class MenuApp(App):
index = NumericProperty(-1)
def build(self):
my_callback = Menu()
Clock.schedule_interval(my_callback.is_connected, 0.5)
return my_callback # Menu()
if __name__ == '__main__':
MenuApp().run()
main.kv
<Menu>:
canvas.before:
Rectangle:
pos: self.pos
size: self.size
manager: screen_manager
orientation: "vertical"
ActionBar:
size_hint_y: 0.15
background_image: ''
background_color: 0.349, 0.584, 0.917, 1
ActionView:
ActionPrevious:
id: actprev
title: "[b]RheoSb[/b]"
markup: True
##color: 0.105, 0.109, 0.113,1
font_size: 100
#app_icon: './assest/v3.jpg'
app_icon: './Asset/VL2.png'
with_previous: False
##on_release: root.set_previous_screen()
#on_press: root.manager.current= 'home'
on_press: root.set_previous_screen()
on_press: root.btn_SwipeSound()
ActionButton:
id:errorBtn
text:''
icon: ''
on_press:root.error_logPopup()
ActionButton:
id:EthBtn
important: True
text:''
icon: './Asset/EE1.png'
ActionButton:
id:motorBtn
text:''
icon: './Asset/mm.png'
ScreenManager:
id: screen_manager