Kivy 将文本从微调器发送到另一个函数

Kivy Sending text from spinner to another function

我一直在努力弄清楚如何将微调器中编辑的值 select 获取到另一个函数中。我基本上需要用户 select 一些选项,然后按 "save" 提示另一个函数将数据写入文件(现在我只是将其设置为打印)。当我运行 form.finkle 函数时,它在 0x02C149D0

处打印 kivy.uix.button.Button 对象

我确信它很容易解决,但我已经坚持了好几天。

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.popup import Popup
from kivy.uix.textinput import TextInput
from kivy.uix.spinner import Spinner

condspin = Spinner(text='Condition',values=('Good','Fair','Poor','Missing'))
typespin = Spinner(text='Type', values=('Metal','Wood','Pin','Missing'))
commlabel = Label(text='Comment')       
commtext = TextInput(text="")

class Goose(App):
    def build(self):
        layout = GridLayout(cols=2,rows=6,padding=10,spacing=10)    
        layout.add_widget(Button(text='Hunter Parking'))
        layout.add_widget(Button(text='Boat Launch'))
        layout.add_widget(Button(text='ETRAP'))
        layout.add_widget(Button(text='Monument',on_press=form.monform))
        layout.add_widget(Button(text='Camp Site'))
        layout.add_widget(Button(text='Sign'))
        layout.add_widget(Button(text='Building'))
        layout.add_widget(Button(text='Trail Head'))
        layout.add_widget(Button(text='Dam'))
        layout.add_widget(Button(text='Day Use'))
        layout.add_widget(Button(text='Pavilion'))
        layout.add_widget(Button(text='Misc Point'))
        return layout

class form():    
    def finkle(condtest):
        print condtest

    def monform(self):
        monbox = GridLayout(cols=2,rows=8,padding=20,spacing=20)
        monpopup = Popup(title="Monument",content=monbox)
        closebut = Button(text="Close")
        closebut.bind(on_press=monpopup.dismiss)
        savebut = Button(text="Save Point")
        savebut.bind(on_press=form.finkle)
        condtest = condspin.text
        monbox.add_widget(condspin)
        monbox.add_widget(typespin)
        monbox.add_widget(commlabel)
        monbox.add_widget(commtext)
        monbox.add_widget(savebut)
        monbox.add_widget(closebut)

        monpopup.open()

Goose().run()

由于您已将微调器设为全局,因此您可以直接 print(condspin.text)。更一般地说,您可以将微调器作为参数传递,例如

from functools import partial
savebut.bind(on_press=partial(self.finkle, condspin))

并将 finkle 方法重新定义为

def finkle(self, spinner, button)

请注意,我将 form.finkle 更改为 self.finkle 并添加了 self 和 spinner 参数。像这样通过 class 调用方法是不好的做法。

您的代码中还有其他一些严重的不良风格,我建议您进行一些其他更改。大多数情况下,我基本上会使用 kv 语言来处理所有事情,这将使小部件树更清晰,对以后的更改更健壮,并且还使此绑定非常简单(您可以通过 kv id 引用微调器文本).此外,表单 class 是半不必要的,您可以将其替换为您在 monform 函数中创建的 GridLayout 的 FormWidget,将其所有子项和行为添加到 kv.