【问题标题】:Kivy Unable to Update the action button IconKivy 无法更新操作按钮图标
【发布时间】:2019-05-02 05:05:46
【问题描述】:

我正在使用树莓派模块构建 Kivy 界面。不幸的是,当以太网在操作栏上断开连接时,我无法更改图标。当以太网电缆连接时,我已经分配了一个图标,但是断开连接时它不会更新我的资产文件夹中的图标。基本上,当我反复使用时,应用程序可以工作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 时钟时间表..

【问题讨论】:

  • 在一个地方引用EE.png,在另一个地方引用EE1.png。是不是打错字了?
  • @Kevin:您的代码运行良好,即当 Internet 断开连接时,它会显示不同的图标。 EE.png 是否存在于文件夹 .Asset 中?
  • 嗨 @ikolim 是的 EE.png 在我的 ./Asset 文件夹中。./Asset 文件夹中的所有三个图标(EE1.png/mm.png/EEpng)。当我更改断开连接的图标时到 mm.png.App 有效。但我想显示一个不同的图标。
  • @Kevin:请分享所有三个图标,以便我们进行测试。谢谢。
  • @ikolim 请参阅问题的编辑部分。

标签: python python-3.x kivy kivy-language


【解决方案1】:

它适用于下面的示例。测试环境为笔记本电脑和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

输出

【讨论】:

  • 如果您不介意请参考新的编辑。 BackgroundScheduler() 导致我的问题!谢谢堆。!
  • 能否提供BackgroundScheduler()的代码。
  • 无论如何感谢堆总是帮助解决问题!不要再麻烦你了。。那就好! ;) 我将进一步研究为什么代码会损坏.. 如果你碰巧找到原因.. 请将其放入..
  • @ikolim 我已经尝试实现您检查连接的示例。但即使事件已安排并运行,它也不会更新图标图像。请问您对为什么会这样有什么建议吗?
  • @Hmerman6006:在我的示例运行时,当我断开 WiFi 时,它会更新图标。
猜你喜欢
  • 1970-01-01
  • 2016-03-02
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
相关资源
最近更新 更多