使用 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 - 在调用函数的另一个屏幕中替换标签的值