簡體   English   中英

我在Kivy Python類上是新手

[英]Im New on kivy Python classes

我在嘗試執行file.kv的Kivy上是新手

AddLocationForm:
<AddLocationForm@BoxLayout>:
    orientation:'vertical'
    Button:
        on_press:
            Test()
<Test@BoxLayout>:
    Label:
        text:"button was clicked"

當我單擊按鈕時我想要其他類上的函數執行

在Kivy中,當您定義這樣的小部件時:

<SomeWidget>:

您正在定義根窗口小部件規則,此窗口小部件只能影響其中的子窗口小部件。

例如:

<SomeWidget>:
    BoxLayout:
        Button:
            text: 'Test Two'
        Button:
            text: 'Test One'

要影響Root Widget中的屬性,您需要使用ID。 有兩種方法可以執行此操作,您可以執行root.ids [X] .property

X是小部件的位置,您也可以使用自己創建的ID(我更喜歡的方法,因為它更清楚我在影響什么)

<SomeWidget>:
     BoxLayout:
         Button:
             id: ButtonOne
             text: 'Button One'
             on_press: print(self.text)
         Button:
             text:
             on_press: root.ids.ButtonOne.text = 'Button Two Was Clicked'

在這里,root是指頂級小部件或“ root”小部件,其中包含

<WIDGETNAMEHRE>: 

然后,ids本質上是一個存儲所有IDs(包括子代IDs的字典),因此您通常只需要使用root.ids.button而不是root.ids.buttonparent.ids.button即可。

您在示例中定義了兩個根窗口小部件。 考慮這些的最好方法是將它們視為類(因為本質上就是它們)。 當您擁有python類時,您不會直接使用該類,而是該類創建一個Object。

因此,您需要做的是將另一個Widget類的對象添加到父Widget。

例如

<TestWidget>:
    Button:
        text: 'change text'
        on_press: root.parent.parent.ids.ButtonOne.text = 'Button Was Clicked'

<PrimaryWidget>:
    BoxLayout:
        TestWidget:
        Button:
            id: ButtonOne
            text: 'Click the other one'

在這種情況下,當我們單擊“按鈕”時,我們首先要進入根目錄(即TestWidget),然后獲得TestWidget的父級(在本例中為Primary下的BoxLayout),然后得到該父級(PrimaryWidget) ),然后我們訪問ButtonOne所屬的PrimaryWidget的ID。

您還可以通過應用程序實例訪問事物,並從主窗口小部件向下進行操作。

<TestWidget>:
    Button:
        text: 'change text'
        on_press: app.root.ids.ButtonOne.text = 'Button Was Clicked'

在這種情況下,我們轉到應用程序,然后轉到應用程序的根窗口小部件(PrimaryWidget,基本上是在def build(self)方法中返回的kv文件),然后訪問ButtonOne的ID。

關於ID的最后一點也是,您也可以訪問自定義子窗口小部件的ID,例如:

<TestWidget>:
    Button:
        id: ButtonTwo
        text: 'change text'
        on_press: app.root.ids.ButtonOne.text = 'Button Was Clicked'

<PrimaryWidget>:
    BoxLayout:
        TestWidget:
            id: test
        Button:
            id: ButtonOne
            text: 'Click this one'
            on_press: root.ids.test.ids.ButtonTwo.text = 'The other button was clicked'

因此,在這種情況下,我們將要root(primarywidget),然后我們將TestWidget id的訪問名為“ test”,然后從其id訪問其ButtonTwo。

TestWidget在這里需要自己的ID的原因是,如果我們使用多個TestWidget,則需要指定我們要更改的TestWidget的ButtonTwo文本(否則,理論上,當我們只希望更改一個時,它們都可以更改)。

由於您似乎正在嘗試從python代碼訪問已定義的函數,因此您所需要做的就是找到它所包含的相關根窗口小部件並使用地址:

假設該函數包含在TestWidget中,並且您想從非testwidget按鈕執行該函數以更改testwidget按鈕的文本,則可以在python類文件中執行以下操作:

class PrimaryWidget(Layoutofyourchoice):

    def change_text(self):
       self.ids.test.ids.ButtonTwo.text = 'CHANGED TEXT'

然后在您的kv文件中,您將執行以下操作:

<PrimaryWidget>:
     BoxLayout:
         TestWidget:
             id: Test
         Button:
             on_press: root.change_text()

希望對您有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM