2017-12-30 8 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

관련 문제