如何在kivy中创建输入对话框?

时间:2017-12-30 04:35:28

标签: python kivy

我在kivy中创建了一个输入对话框。但我不确定这是正确的格式还是正确的代码或正确的编码方式。我试图在按钮下方的弹出窗口中显示错误消息。它在输入为空时有效,输入后也显示错误。

任何人都可以帮助我以正确的方式做到这一点吗?

Builder.load_string("""
<Main>:
    Button:
        text: 'Click'
        on_press: root.callit()

<design>:
    orientation: 'vertical'
    cols:2
    pos: self.pos
    size: root.size
    Label:
        text: 'Enter Value'
    TextInput:
        id: val
        multiline: False
        hint_text:'Age'
        input_filter: 'int'
    Button:
        text: 'Enter'
        background_color: 255,0,0,0.9
        on_press: root.enter()
    Button:
        text: 'Cancel'
        background_color: 0,1,255,0.7
        on_press: root.cancel()
    #Label:
    #   id: er
    #   foreground_color: [1,250,100,1]
    #   text: 'Error'
""")
class design(GridLayout):
    def __init__(self,**kwargs):
        super(design,self).__init__(**kwargs)
        #cancel=ObjectProperty(None)
        self.er=Label(text='Please enter some input!')

    def enter(self):
        if self.ids.val.text=='':
            print "Enter text"
            #self.add_widget(self.er)#Label(text='Please enter some input!',width=200))
            #time.sleep(10000)
            #self.remove_widget(self.er)
            #self.ids.er.text='Please enter some input!'
            #self.ids.val.hint_text='Please enter input!'
        else:
            print self.ids.val.text
            #self.ids.val.hint_text='Please enter input!'
            self.ids.val.text=''
            self.cancel()


    def cancel(self):
        obj=OpenDialog()
        obj.call_pops(1)

class Main(BoxLayout):
    pass

    def callit(self):
        obj=OpenDialog()
        obj.call_pops(0)

class OpenDialog(Popup):
    global popup
    cont=design()
    popup=Popup(title='InputDialog',content=cont,size_hint=(None, None), size=(400, 150),auto_dismiss=False)

    def call_pops(self,val):
        if val==1:
            self.close_pops()
        elif val==0:
            popup.open()

    def close_pops(self):
        popup.dismiss()


class SriPop(App):
    def build(self):
        return Main()

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

1 个答案:

答案 0 :(得分:0)

您需要使用on_text事件,以便在输入数字时标签停止显示错误。例如:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.properties import NumericProperty, StringProperty, ObjectProperty
from kivy.lang import Builder


Builder.load_string("""
<Main>:
    BoxLayout:
        orientation: "vertical"

        Button:
            text: 'Click'
            on_press: root.callit()

        Label:
            id: age_lab
            size_hint_y: 0.1
            text: root.str_age

<OpenDialog>:
    title: 'InputDialog'
    size_hint: None, None
    size: 400, 120
    auto_dismiss: False
    text: input.text
    lb_error: er

    BoxLayout:
        orientation: 'vertical'
        pos: self.pos
        size: root.size

        BoxLayout:
            orientation: 'horizontal'
            Label:
                text: 'Enter Value'

            TextInput:
                id: input
                multiline: False
                hint_text:'Age'
                input_filter: 'int'
                on_text: root.error = ''

        BoxLayout:
            orientation: 'horizontal'
            Button:
                text: 'Enter'
                background_color: 255,0,0,0.9
                on_press: root._enter()

            Button:
                text: 'Cancel'
                background_color: 0,1,255,0.7
                on_press: root._cancel()

        Label:
            id: er
            foreground_color: 1, 250, 100, 1
            color: 1, 0.67, 0, 1
            size_hint_y: None
            height: 0
            text: root.error


""")


class Main(BoxLayout):
    age = NumericProperty()
    str_age = StringProperty("None")

    def callit(self):
        obj = OpenDialog(self)
        obj.open()

    def on_age(self, *args):
        self.str_age = "Age: {}".format(self.age)


class OpenDialog(Popup):

    _age = NumericProperty()
    error = StringProperty()

    def __init__(self, parent, *args):
        super(OpenDialog, self).__init__(*args)
        self.parent = parent
        self.bind(_age=self.parent.setter('age'))

    def on_error(self, inst, text):
        if text:
            self.lb_error.size_hint_y = 1
            self.size = (400, 150)
        else:
            self.lb_error.size_hint_y = None
            self.lb_error.height = 0
            self.size = (400, 120)

    def _enter(self):
        if not self.text:
            self.error = "Error: enter age"
        else:
            self._age = int(self.text)
            self.dismiss()

    def _cancel(self):
        self.dismiss()


class SriPop(App):
    def build(self):
        return Main()

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

enter image description here

相关问题