【问题标题】:Getting started with Kivy: getting user input using KivyKivy 入门:使用 Kivy 获取用户输入
【发布时间】:2015-11-04 15:43:39
【问题描述】:

我想从 Kivy 开始,因为我用 Python 编写代码,但我觉得这真的很难!你能很好地解释它是如何工作的吗? 例如,即使这看起来也很模糊(这是他们网站的第二个例子)。

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput


class LoginScreen(GridLayout):

    def __init__(self, **kwargs):
        super(LoginScreen, self).__init__(**kwargs)
        self.cols = 2
        self.add_widget(Label(text='User Name'))
        self.username = TextInput(multiline=False)
        self.add_widget(self.username)
        self.add_widget(Label(text='password'))
        self.password = TextInput(password=True, multiline=False)
        self.add_widget(self.password)


class MyApp(App):

    def build(self):
        return LoginScreen()


if __name__ == '__main__':
    MyApp().run()

我想从一个要求用户输入并显示由它创建的内容的基本应用程序开始。 例如,在没有任何 GUI 的基本 Python 中,它可能是:

def hex_enc(text_input):
    return text_input.encode('hex')

def hex_dec(text_input):
    return text_input.decode('hex')

while True:
    text_input = raw_input('Input  : ')
    mode = raw_input('Mode   : ').lower()
    if ('encrypt' in mode):
        print hex_enc(text_input)
    else:
        print hex_dec(text_input)

我想我需要一个文本输入和一个标签,这将是该文本输入的结果。 但这非常混乱,我不知道并将所有这些用于kivy课程!

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    好的。这是一个仅在 Python 中实现的示例,没有 .kv 文件。我在那里有一些 cmets 试图逐步解释发生了什么。它会弹出一个文本框,用户可以在其中输入内容,并在添加感叹号后将其吐回标签中。显然,您可以做比添加标点符号更有趣的事情,但我决定让示例保持简单。

    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.label import Label
    from kivy.uix.textinput import TextInput
    
    
    class MyDumbScreen(BoxLayout):  # Changed to a BoxLayout for simplicity
    
        def __init__(self, **kwargs):
            # Call the base class constructor :)
            # Note that this is where it will pick up on any stuff you did in the
            # .kv file (if you have one)
            super(MyDumbScreen, self).__init__(**kwargs)
            self.orientation = "vertical"
    
            # Here we are just creating a text input
            my_user_input = TextInput()
    
            # Here we add it to MyDumbScreen's widget tree.  If you skip this step,
            # you'll never see your precious widget.
            self.add_widget(my_user_input)
    
            # This is the label that will hold a modified version of the user's
            # input
            my_output = Label(text="initial value")
            self.add_widget(my_output)
    
            # Here we create a callback function
            # This callback will be called whenever the 'text' property of
            # our TextInput is modified
            def callback(instance, value):
                my_output.text = value + "!"
    
            # Here we "bind" the callback to the TextInput's 'text' property
            # If you skip this step, you won't see the changes ever take place
            my_user_input.bind(text=callback)
    
    
    class MyApp(App):
    
        def build(self):
            return MyDumbScreen()
    
    
    if __name__ == '__main__':
        MyApp().run()
    

    请注意,我通常认为这是一种比简单地使用 .kv 文件更复杂的方法。

    如果你走这条路,你的类定义将如下所示:

    class MyDumbScreen(BoxLayout):  # Changed to a BoxLayout for simplicity
        pass
    

    您的 .kv 文件将如下所示:

    <MyDumbScreen@BoxLayout>:
        orientation: "vertical"
    
        TextInput:
            id: my_user_input
            text: ""
        Label:
            id: my_output # This id isn't serving a purpose
            text: my_user_input.text + "!"
    

    使用 .kv 方法,您不必担心手动向小部件树添加内容或自己编写/添加回调。

    请记住,默认情况下,Kivy 将根据您的 App 类的名称和 .kv 文件的名称加载 kv 文件,并且区分大小写因操作系统而异。

    【讨论】:

    • 我接受了您的 MyApp.kv 替代建议,但只得到黑屏。你有你的示例代码吗?
    • 您的意思是上面答案中发布的示例代码?是的。我复制/粘贴以验证。它至少在我的系统上有效,我相信它是在最新版本上。但是,我没有在我的答案中添加任何文件名。如果你得到一个没有错误信息的黑屏,我猜 Kivy 找不到你的 *.kv 文件。如果您使用的是 *nix 系统,请确保您没有遇到区分大小写的问题。否则,请确保您的 kv 文件名中没有“app”。如果你的 py 文件名为“myapp.py”,kivy 会查找“my.kv”。
    • 谢谢威尔!将 MyApp(App) 更改为 myapp 和所有引用;还有,我的.kv。现在完美运行!
    • Kivy 在搜索 kv 文件时应该将类名转换为小写;只有在文件名中使用大写字母时,大小写问题才会成为问题。我猜您将 kv 文件命名为 myapp.kv 之类的名称,这就是问题所在。
    猜你喜欢
    • 1970-01-01
    • 2021-01-24
    • 2022-01-05
    • 2014-10-23
    • 2015-11-12
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多