2017-06-02 99 views
1

我是Python类中的新成员,并尝试通过Tkinter编写科学代码的接口。但是我不能从一个类或函数中调用一个函数(它在另一个类中并打开一个不同的框架)。我一直在寻找2天以上,但找不到我的案件的答案。如果你解释为像解释一个孩子,我会很高兴,因为我不知道很多技术细节。无法从其他类调用函数到某个类

我的代码结构是这样的:

class first_class(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
       .... 
     def WhateverFunction(): 
      "do sth" 
class second_class(tk.Tk): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
       ..... 
     **I want to use "WhateverFunction" here** 
       ..... 

所以基本上,我无法从其他类访问该功能。

我在网上找到的搜索类似Python using methods from other classes方法。 Bu这并没有解决我的问题。这也许是因为我正在使用不同的Tkinter框架。我现在不...谢谢你,欢呼!

+0

如果要使用该功能,则需要从第一个类继承。 'class second_class(first_class):'或从'first_class()中调用类方法WhateverFunction()' –

+0

'WhateverFunction'是否需要成为'first_class'的方法?注意:你的代码片段缩进的方式,'WhateverFunction'实际上是在first_class中定义的。__init__',因此只能在'first_class .__ init__'中访问, –

+0

@brunodesthuilliers啊......已经把它放到了复制/粘贴或缩进错误。但是,是的,这会改变任何可能的答案 –

回答

1

在您的代码中,您将函数WhateverFunction定义为__init__中的本地函数。所以从代码的其他部分看不到它,这是不可能被调用的。例如,您可以将您的功能实现为一种方法。它应该是这样的:

class first_class(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
      .... 
    def WhateverFunction(self): 
     "do sth" 

现在的功能也随处称为的first_class实例的方法:

first_class_instance = first_class() 
first_class_instance.WhateverFunction() 
+0

好吧,除了缺少'self'之外,它仍然可以通过'first_class.WhateverFunction()'调用......这并不是不可能被调用。 –

+0

@JonClements看看OP的代码。 'WhateverFunction'在'__init__'中是局部的,所以它不能被调用,因为它不存在于外部。 – Fomalhaut

+0

是的......只是注意到......看看我对布鲁诺问答的评论。如果这是故意的,那么你是正确的。 –

-1

只需创建该类的一个实例,并在second_class实例应该由第一个实例组成时调用该方法。

def second_class(tk.Tk): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 

     first_object = first_class().WhateverFunction() 

现在比较好的办法是从不是第一个继承second_class,并呼吁考虑这两类方法具有相同的父,提供传承才有意义。

def second_class(first_class): 

    def __init__(self, parent, controller): 
     super(second_class, self).__init__(parent, controller) 

     self.WhateverFunction() 

注: - 请尽量遵循的Python的某些惯例像骆驼和方法/与蛇的情况下功能命名类。

+0

继承很可能不是一个“更好的方法”...组合/委托通常是更好的选择,实际上在GUI类之外定义的普通函数或实用程序类也是共享代码而不引入不适当依赖性的好方法。 –

+0

如果他将上面的类用作mixin,该怎么办?我同意组成通常比继承好,但有些地方继承会更有意义。 – hspandher

+0

“有地方”确实 - 我的意思是,有几个地方继承是正确的解决方案。只有少数...现在我们没有足够的上下文来真正地说出什么是最好的解决方案,因为我们不知道“WhateverFunction()”是什么,也不知道它是否真的属于'first_class'开始;) –

0

我问完全相同的问题就在这里了一段时间后没有响应。基本上,你不能这样做。 WhateverFunction__init__范围内,其本身可以只称为second_class存在。这是通过与您关联的'使用其他课程中的方法'问题中描述的方法完成的,但是对于您要执行的操作而言,这是无用的,因为您只能从__init__获得输出,因此您不能访问该功能中定义的任何功能。

要解决这个问题,为什么不定义WhateverFunction全球然后调用它像往常一样,或者宣布它__init__功能之外,但仍然在first_class