2017-12-30 53 views
0

私は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() 
+0

私はいくつかの文法的な改良を加え、問題のタグを洗練しました。私はこの質問がhttps://codereview.stackexchange.comに適しているかどうか疑問を持っています。 – Nae

答えて

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

+0

ありがとうFJSevilla!どうもありがとうございます。何かお尋ねしてもいいですか?いいプログラマーですか?あなたのようなプログラムを書くために何を知っておくべきですか?私を案内してアドバイスをお願いします! – SagitSri

関連する問題