使用 Kivy 的 Python 跨类函数调用

Posted

技术标签:

【中文标题】使用 Kivy 的 Python 跨类函数调用【英文标题】:Python Cross Class function call with Kivy 【发布时间】:2017-05-10 10:55:43 【问题描述】:

我想从cpopup 类调用reflist() 函数。我不确定该怎么做。在self.dismiss() 行之后,我尝试了很多方法。

narr.reflist() 感觉它应该可以工作,但事实并非如此。我想可能是因为我需要引用类的实例而不是类本身,但我不太确定实例名称是什么以及如何引用它。

narr().reflist() 更成功一点,因为它不会出现错误。但结果出乎意料(什么也没发生)。也许它确实有效,但我只是还不了解类中的变量范围。

execfile("drawinglist.py")
    dlists = []
    dsource = []

    class cpopup(Popup):
        filechooser = ObjectProperty(None)
        def on_press_dismiss(self, *args):
            self.dismiss()
            #return False

        def load(self, path, filename):
            fdid = self.id
            bodycon = ObjectProperty(None)
            if fdid == "Narr":
                print parseNarrative(filename)
                dsource.append(filename)
                dlists.append(parseNarrative(filename))
                self.dismiss()
                narr.reflist()
            if fdid == "Dir":
                print parseFolder(filename, True)
                self.dismiss()
            if fdid == "Dl":
                print parseDrawinglist(filename)
                self.dismiss()

    class narr(BoxLayout):
        bodycon = ObjectProperty(None)
        dlists  = ObjectProperty(None)
        def loadNarr(self):
            pop = cpopup()
            pop.title="Select a file to generate Drawing List from"
            pop.id = "Narr"
            pop.filechooser.multiselect = True
            pop.open()

        def loadDir(self):
            pop = cpopup()
            pop.title="Select a Directory to load drawing list from."
            pop.id = "Dir"
            pop.filechooser.dirselect = True
            pop.open()

        def loadDl(self):
            pop = cpopup()
            pop.title="Select a drawing list (.pdfs) to generate list from"
            pop.id = "Dl"
            pop.filechooser.multiselect = True
            pop.open()

        def reflist(self):
            words = ""
            source = ""
            index = []

            for d in dlists:
                for a in d:
                    dwg = str(a)
                    if dwg not in index:
                        index.append(dwg)

            for l in dsource:
                fl = l[0]
                fl = fl.split("/")
                fl = fl[-1]
                source = source + fl +"\n"

            self.dlists.text = source
            self.bodycon.text = words

    class narrApp(App):
        def build(self):
            return narr()

    if __name__=="__main__":
        narrApp().run()

【问题讨论】:

【参考方案1】:

方法很多,看用途:

如果您的班级彼此相等通过App.get_running_app() 在您的第二个班级的实例中调用它,如下所示(仅限 Kivy):

class MyWidget(Widget):
    def __init__(self, *args, **kwargs):
        self.app = App.get_running_app()
        self.app.my_widget = self

    def func(self, *args):
        pass

class MyAnotherWidget(Widget):
    # you'll need this piece in the class you want to
    # access func() from and you'll need App instance
    # present too
    def __init__(self, *args, **kwargs):
        self.app = App.get_running_app()
        self.app.my_widget.func()

master ↔ slave classes(一个总是在上面):

class Slave:
    def func(self, *args):
        pass

class Master:
    # creating of the slave instance is required
    def __init__(self, *args, **kwargs):
        self.slave_class = Slave()
        self.slave_class.master_class = self
        self.slave_class.func()

基本上这就是App ↔ 其他所有关系的运作方式。有主要的主类,您唯一要做的就是将“从”类的附加引用添加到“主”类的已创建实例。

静态方法s

class Something:
    @staticmethod
    def static_func(*args):
        pass

class SomethingElse:
    def __init__(self, *args, **kwargs):
        Something.static_func()

装饰器允许你像那样使用它,但是你不能访问静态方法所属的类中的任何东西(没有self,没有课堂乐趣)。您肯定已经在这种形状的某个包中遇到过它们:Package.do_something(*args),这可能是一个静态方法。

类方法s

class Something:
    def __init__(self, first=None, second=None, *args, **kwargs):
        print(first, second)

    @classmethod
    def class_func(cls, arg_list):
        special_Something = cls(arg_list[0], arg_list[1])
        return special_Something

class SomethingElse:
    def __init__(self, *args, **kwargs):
        new_something = Something.class_func(['hi', 'there'])

基本上,例如,如果您想要传递一个特殊格式来创建一个类,但该类有 不同 输入参数,您可以使用类似的 classmethod 来了解您的输入你想使用它的类。

【讨论】:

以上是关于使用 Kivy 的 Python 跨类函数调用的主要内容,如果未能解决你的问题,请参考以下文章

Python/Kivy:如何在 ctrl+a 键盘事件上调用函数

Python / Kivy - 在另一个调用函数的屏幕中替换标签的值

Python / Kivy - 在调用函数的另一个屏幕中替换标签的值

C++ - Qt QObject::connect 跨类的 GET 请求使用

在 Kivy/Python 中作为线程运行时表现奇怪的函数

Kivy 在另一个类中调用函数