【问题标题】:Printing widgets Id in kivy在kivy中打印小部件ID
【发布时间】:2021-07-24 22:15:02
【问题描述】:

如果您不确定小部件的 id 是什么,有没有办法检查或打印它?我有一个我制作的布局,它是一个简单的 BoxLayout,其中我的标签有它的 id(它在 kv 文件中完成),而不是我在 GridLayout 中多次使用该布局。现在我有多个标签,但从技术上讲,它们具有相同的 id,或者如果您多次使用,kivy 可能会更改 id?这就是我想通过打印他们所有的 id 来检查的内容。

a3.py



from BareBones import Skeleton

menu = ['espresso', 'latte', 'capuccino', 'nescafe', 'Sahlep', 'Mahlep']
keys = []


class Double(BoxLayout):
    pass
class NewLayout(GridLayout):
    def set_text(self,text):
        print(self.root.ids.Skeleton.ids['label_id'].text)


    pass

class MainPage(BoxLayout):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)


        iterator = 1



        for i in range(len(menu)):
            b = Button(size=(100,50))
            self.ids[str(iterator)] = b

            self.add_widget(b)

            keys.append(str(iterator))
            iterator = iterator+1
            print(keys)
            print(len(menu))

        for x, y in zip(menu, keys):
            self.ids[y].text = x


class RightSide(BoxLayout):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.orientation='vertical'

        for i in range(len(menu)):
            self.add_widget(Skeleton())






kv = Builder.load_file("b3.kv")


class MainApp(App):
    def build(self):
        return kv

MainApp().run()

b3.kv

NewLayout:

    cols: 2
    MainPage:
    RightSide:



<MainPage>:
    orientation: 'vertical'



<Skeleton>
    b1: b1
    b2: b2
    label_id: label_id

    Button:
        id: b1
        text:'+'
        on_press: root.on_button_click_plus()

    Label:
        id: label_id


    Button:
        id: b2
        text:'-'
        on_press: root.on_button_click_minus()


BareBones.py




class Skeleton(BoxLayout):
    count = 0
    my_text = ''
    drink_name = ''

    def on_button_click_plus(self):
        print("Button clicked")
        self.count += 1
        self.ids.label_id.text = str(self.count)
        self.my_text = str(self.count)
        return self.my_text
    def on_button_click_minus(self):
        print("Button clicked")
        self.my_text = str(self.count)
        self.ids.label_id.text = str(self.count)

        if self.count > 0:
            self.count -= 1
            self.ids.label_id.text = str(self.count)
        else:
            pass

    def trying(self):
        pass


class PlusMinus(BoxLayout):
    menu = ['espresso']
    keys = []

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.orientation='vertical'
        menu = self.menu

        self.add_widget(Skeleton())

所以这基本上看起来像这样:

我基本上想做的是有一个按钮来收集所有标签文本(数字),这样我就可以将它们与菜单数组配对,以了解其中有多少被添加到我们的购物篮中。我也想重置标签,但是我不知道如何获取代码中如此深入的文本。

【问题讨论】:

    标签: python dictionary kivy widget ids


    【解决方案1】:

    如果您在Skeleton 类中将drink_name 更改为StringProperty:

    class Skeleton(BoxLayout):
        count = 0
        my_text = ''
        drink_name = StringProperty('')
    

    并在创建每个 Skeleton 实例时为该属性分配一个值:

    class RightSide(BoxLayout):
    
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
            self.orientation='vertical'
    
            for i in range(len(menu)):
                self.add_widget(Skeleton(drink_name=menu[i]))
    

    然后你可以通过MainPage类中的一个方法来统计添加的饮料数量:

    def tally(self):
        rightside = kv.ids.rightside
        for skel in rightside.children:
            if isinstance(skel, Skeleton):
                print(skel.drink_name, skel.ids.label_id.text)
    

    加上另一项必需的更改。在您的kv 中,为RightSide 实例添加id:

    NewLayout:
    
        cols: 2
        MainPage:
        RightSide:
            id: rightside
    

    【讨论】:

    • 所以应用程序是这样运行的,但没有发生任何不同,我该如何使用这个计数功能。当我们在 MainPage 中使用 kv 时也会出现警告(它运行时不会出错,但我认为我还没有使用过该函数)我认为错误是“UnboundLocalError: local variable 'kv' referenced before assignment”
    • 我还将计数方法绑定到一个按钮,它也给出了错误
    • 所以经过多次尝试,我得到的最常见错误是:rightside = kv.ids.rightside File "kivy/properties.pyx",第 864 行,在 kivy.properties.ObservableDict.__getattr__ AttributeError : 'super' 对象没有属性 'getattr' 进程以退出代码 1 结束
    • 糟糕!忘记了一项必要的更改。请参阅我的更新答案。
    • 哇,这真是太棒了,你能解释一下它是如何工作的吗? “儿童”关键字究竟指的是什么?是不是引用widget下的按钮和标签的关键字?
    【解决方案2】:

    所以这是 Pycharm 显示的错误,kv 下的红色突出显示。

    class MainPage(BoxLayout):                                                                                    
                                                                                                                  
        def __init__(self, **kwargs):                                                                             
            super().__init__(**kwargs)                                                                            
                                                                                                                  
                                                                                                                  
            iterator = 1                                                                                          
                                                                                                                  
                                                                                                                  
                                                                                                                  
            for i in range(len(menu)):                                                                            
                b = Button(size=(100,50))                                                                         
                self.ids[str(iterator)] = b                                                                       
                                                                                                                  
                self.add_widget(b)                                                                                
                                                                                                                  
                keys.append(str(iterator))                                                                        
                iterator = iterator+1                                                                             
                print(keys)                                                                                       
                print(len(menu))                                                                                  
                                                                                                                  
            for x, y in zip(menu, keys):                                                                          
                self.ids[y].text = x                                                                              
                                                                                                                  
        def tally(self):                                                                                          
            rightside = self.kv.ids.rightside                                                                     
            for skel in rightside.children:                                                                       
                if isinstance(skel, Skeleton):                                                                    
                    kv = Builder.load_file("b3.kv")                                                               
                    print(skel.drink_name, skel.ids.label_id.text)                                                
                                                                                                                  
                                                                                                                  
                                                                                                                  
    class RightSide(BoxLayout):                                                                                   
                                                                                                                  
        def __init__(self, **kwargs):                                                                             
            super().__init__(**kwargs)                                                                            
            self.orientation='vertical'                                                                           
                                                                                                                  
            for i in range(len(menu)):                                                                            
                self.add_widget(Skeleton(drink_name=menu[i]))                                                     
                                                                                                                  
                                                                                                                  
                                                                                                                  
                                                                                                                  
                                                                                                                  
                                                                                                                  
                                                                                                                  
    kv = Builder.load_file("b3.kv")                                                                               
                                                                                                                  
                                                                                                                  
                                                                                                                  
                                                                                                                  
                                                                                                                  
    class MainApp(App):                                                                                           
        def build(self):                                                                                          
            return kv                                                                                             
                                                                                                                  
                                                                                                                  
                                                                                                                  
                                                                                                                  
                                                                                                                  
    MainApp().run()                                                                                               
    
    

    所以我更改了 Skeleton 文件中的 String 属性,代码看起来像你告诉我要添加的更改。但是什么也没发生,我该如何实际使用 tally() 方法?

    【讨论】:

      猜你喜欢
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多