簡體   English   中英

Kivy-如果一個按鈕與回調(實例)綁定,如何調用其他函數

[英]Kivy-If A button bind with callback(instance), how to call other functions

我想要的是:

按下按鈕 A >> 打開選擇文件夾對話框 >> Select 文件夾 A >> 在 label A 中顯示路徑 A;

按下按鈕 B >> 打開選擇文件夾對話框 >> Select 文件夾 B >> 在 label B 中顯示路徑 B。

如果你運行我的代碼,它會非常好用。 但是如果你仔細閱讀代碼,你會發現一個問題。

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import StringProperty
from kivy.properties import ObjectProperty

from kivy.lang import Builder
Builder.load_string('''
#:kivy 1.11.0
<Root>:
    loadFolderA: loadFolderA
    loadFolderB: loadFolderB

    cols: 2
    rows: 2
    Button:
        id: selectFolderA
        text: 'select folder A'
        pos_hint: {'center_x': 0.21, 'center_y': .5}
        on_release: root.show_select_folder_dialogA()

    Button:
        id: selectFolderB
        text: 'select folder B'
        pos_hint: {'center_x': 0.785, 'center_y': .5}
        on_release: root.show_select_folder_dialogB()

    Label:
        id: loadFolderA
        text: 'path A'
        font_size: 30
        pos_hint: {'center_x': 0.21, 'center_y': .5}

    Label:
        id: loadFolderB
        text: 'path B'
        font_size: 30
        pos_hint: {'center_x': 0.785, 'center_y': .5}

<SelectFolder>:
    BoxLayout:
        size: root.size
        pos: root.pos
        orientation: "vertical"
        FileChooserListView:
            id: filechooser

        BoxLayout:
            size_hint_y: None
            height: 30
            Button:
                text: "Cancel"
                on_release: root.cancel()

            Button:
                text: "Choose"
                on_release: root.choose(filechooser.path, filechooser.selection)
''')

class Root(GridLayout):
    posixPathA = StringProperty('')
    posixPathB = StringProperty('')

    def dismiss_popup(self):
        self._popup.dismiss()

    def show_select_folder_dialogA(self):
        content = SelectFolder(choose=self.chooseA, cancel=self.dismiss_popup)
        self._popup = Popup(title="Select Folder", content=content,
                            size_hint=(0.9, 0.9))
        self._popup.open()

    def show_select_folder_dialogB(self):
        content = SelectFolder(choose=self.chooseB, cancel=self.dismiss_popup)
        self._popup = Popup(title="Select Folder", content=content,
                            size_hint=(0.9, 0.9))
        self._popup.open()

    def chooseA(self, path, filename):
        self.posixPathA = path
        self.loadFolderA.text = self.posixPathA
        self.dismiss_popup()

    def chooseB(self, path, filename):
        self.posixPathB = path
        self.loadFolderB.text = self.posixPathB
        self.dismiss_popup()

class SelectFolder(FloatLayout):
    choose = ObjectProperty(None)
    cancel = ObjectProperty(None)

class DropApp(App):
    def build(self):
        return Root()

if __name__ == '__main__':
    DropApp().run()

function 'show_select_folder_dialog' 我寫了兩次,一次用於與按鈕 A 綁定,一次用於按鈕 B。與 function 的“選擇”相同。 這真的讓我很不開心。 所以我想知道我是否可以讓代碼知道按下了哪個按鈕,然后將文件夾路徑傳遞給正確的 label。 希望有人可以提供幫助。

##

花了一整夜,現在我來到了這個地方:

Root.show_select_folder_dialog(Root)

我的計划是使用回調(實例)來知道哪個按鈕正在調用 function。 然后調用 Function 打開選擇文件夾對話框。 這很奇怪,但這條線在這里有效:

 Root.show_select_folder_dialog(Root)

但我不能進一步 go 。 現在 function 報錯:'TypeError: choose() missing 1 required positional argument: 'filename''

希望可以有人幫幫我!

嘿,朋友,我為您的代碼提供了一個簡單的解決方案,可以更輕松地識別您選擇的按鈕,您可以使用 easygui 模塊:

choice = easygui.buttonbox(title="Choose button",msg="Choose a button",choices=["Button 1","Button 2",]) 

這會打開一個框,例如:

在此處輸入圖像描述

現在您可以使用您的 if 條件來執行該過程的 rest。

您可以通過按下按鈕發送 idx 來刪除重復的 A/B 方法:


Builder.load_string('''
#:kivy 1.11.0
<Root>:
    loadFolderA: loadFolderA
    loadFolderB: loadFolderB

    cols: 2
    rows: 2
    Button:
        id: selectFolderA
        text: 'select folder A'
        pos_hint: {'center_x': 0.21, 'center_y': .5}
        on_release: root.show_select_folder_dialog("A")  # send an idx here

    Button:
        id: selectFolderB
        text: 'select folder B'
        pos_hint: {'center_x': 0.785, 'center_y': .5}
        on_release: root.show_select_folder_dialog("B")  # send an idx here

    Label:
        id: loadFolderA
        text: 'path A'
        font_size: 30
        pos_hint: {'center_x': 0.21, 'center_y': .5}

    Label:
        id: loadFolderB
        text: 'path B'
        font_size: 30
        pos_hint: {'center_x': 0.785, 'center_y': .5}

<SelectFolder>:
    BoxLayout:
        size: root.size
        pos: root.pos
        orientation: "vertical"
        FileChooserListView:
            id: filechooser

        BoxLayout:
            size_hint_y: None
            height: 30
            Button:
                text: "Cancel"
                on_release: root.cancel()

            Button:
                text: "Choose"
                on_release: root.choose(filechooser.path, filechooser.selection)
''')

from functools import partial

class Root(GridLayout):
    posixPathA = StringProperty('')
    posixPathB = StringProperty('')

    def dismiss_popup(self):
        self._popup.dismiss()

    def show_select_folder_dialog(self, idx):
        # pass the idx to the choose method
        content = SelectFolder(choose=partial(self.choose, idx),
                               cancel=self.dismiss_popup)
        self._popup = Popup(title="Select Folder", content=content,
                            size_hint=(0.9, 0.9))
        self._popup.open()

    def choose(self, idx, path, filename):
        if idx == "A":  # The "A" button was selected
            self.posixPathA = path
            self.loadFolderA.text = self.posixPathA
        else:  # You can use more elifs if you like
            self.posixPathB = path
            self.loadFolderB.text = self.posixPathB
        self.dismiss_popup()

class SelectFolder(FloatLayout):
    choose = ObjectProperty(None)
    cancel = ObjectProperty(None)

class DropApp(App):
    def build(self):
        return Root()

if __name__ == '__main__':
    DropApp().run()

暫無
暫無

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

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