为啥我的 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.a
的GUI
实例来连接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
类的一个对象并在MainApp
和Keyboard
类中使用它。比如:
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 程序没有从另一个类调用函数?的主要内容,如果未能解决你的问题,请参考以下文章