为啥我的 kivy 程序没有从另一个类调用函数?

Posted

技术标签:

【中文标题】为啥我的 kivy 程序没有从另一个类调用函数?【英文标题】:Why is my kivy program not calling the function from another class?为什么我的 kivy 程序没有从另一个类调用函数? 【发布时间】:2020-07-22 20:23:45 【问题描述】:

我认为这更像是一个 python 问题而不是一个 kivy 问题。

class Keyboard 正在共享来自类 GUI 的方法。我创建了一个名为self.aGUI 实例来连接class Keyboard 中的两个类。另外,我在class MainApp 中创建了一个键盘类实例self.key

当我使用这种方法时,print ("Return button is pressed")“返回”按钮能够执行打印语句。我明白它为什么有效。当我在方法中使用self.a.up() 时,返回按钮不会从class GUI 调用up() 方法。这可能是我遗漏的一个小细节或一个概念。这不是程序其余部分的错误。请提前帮助和感谢。代码:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.lang.builder import Builder
from kivy.properties import ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from kivy.modules import keybinding
from kivy.core.window import Window


class GUI(BoxLayout):
    main_display = ObjectProperty()
    text_input = ObjectProperty()


    def plus_1(self):
        self.value = int(self.main_display.text)
        self.main_display.text = str(self.value + 1)
        print (self.main_display.text)

    def minus_1(self):
        self.value = int(self.main_display.text)
        self.main_display.text = str(self.value - 1)


    def up(self):
        self.main_display.text = self.text_input.text
        self.text_input.text = ''

class Keyboard(Widget):

    def __init__(self,):
        super().__init__()
        self.a = GUI()

        self.keyboard = Window.request_keyboard(None, self)
        self.keyboard.bind(on_key_down=self.on_keyboard_down)

    def on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'enter':
            self.a.up()
#           print ("Return button is pressed")
        return True

class MainApp(App):
    def build(self):
        key = Keyboard()
        return GUI()



if __name__=="__main__":
    app = MainApp()
    app.run()

【问题讨论】:

【参考方案1】:

我认为它工作正常,但在您看不到的另一个对象中。问题是您在屏幕上显示GUI 类的一个对象。对于Keyboard 类,您创建了另一个您看不到的对象。所以解决方案是使用GUI 类的一个对象并在MainAppKeyboard 类中使用它。比如:

class MainApp(App):
    def build(self):
        # here we create an object...
        self.gui = GUI()
        # ...send it to Keyboard class
        key = Keyboard(self.gui)
        # and return it
        return self.gui

class Keyboard(Widget):

    def __init__(self, gui):
        super().__init__()
        # and here we receive that object instead of creating new one
        self.a = gui

【讨论】:

嗨@Lothric,感谢您的快速回复。我刚刚尝试了你的建议,它给了我一个错误。 key = Keyboard(self.gui) TypeError: __init__() 接受 1 个位置参数,但给出了 2 个。另外,我可以在这里阅读更多的概念是什么?再次感谢。 @fishtang 也许你忘记在__init__ 中添加参数gui,比如def __init__(self, gui)。这只是 OOP,这里没有特殊概念。 嗨@Lothric,这就是我正在努力解决的问题。我可以理解一些基本的 OOP,但即使是你的解决方案,我也需要看看我是否可以在没有任何帮助的情况下重复它。再次感谢。

以上是关于为啥我的 kivy 程序没有从另一个类调用函数?的主要内容,如果未能解决你的问题,请参考以下文章

python - kivy:从另一个类调用函数

Python Kivy 无法从另一个类访问 id

从另一个 .java 类调用 onClick 函数

如果我从另一个类调用它,为啥我的 ArrayList 是空的?

从另一个线程更改 kivy 属性

Kivy:无法从另一个类更新文本输入值