Kivy 从 Popup Window 获取值并在屏幕上使用它

Kivy getting values from Popup Window and use it at a Screen

嗨,我是 kivy 的新手,刚开始编程。所以我想做的是,一旦用户在弹出窗口 window 中输入有效的 date/time,弹出窗口将关闭并转到屏幕并创建按钮。我可以知道如何传递从 getDay() 获取的值,即 dayoutput,弹出窗口的时间输出 window 并将其用于另一个 class 吗?并能在 VariesTimeScreen 中使用?

感谢您花时间提供帮助:)

class SetDateTime(Popup):

    def getDay(self):

     set_day = (self.ids.dayofmonth).text
     set_month = (self.ids.month).text
     set_year = (self.ids.year).text

     set_hour = (self.ids.houroftime).text
     set_minutes = (self.ids.minuteoftime).text

     wrongtime = self.ids.wronginput_time

#Calculate Date and Time only when user input a valid number
     if set_day.isdigit() and set_month.isdigit() and 
          set_year.isdigit()andset_hour.isdigit() 
          and set_minutes.isdigit():           
         try:
            set_date = datetime.date(int(set_year), 
            int(set_month),int(set_day))
            set_time = datetime.time(int(set_hour), int(set_minutes))

            if not (set_date >= counttime.todaydate()):
              wrongtime.text = "[color=#FF0000]Date is out of 
              range[/color]"
              if not (set_time >= counttime.todaytime()):
                   wrongtime.text = "[color=#FF0000]Time is out of 
                   range[/color]"

             dayoutput = counttime.calculatedate(set_date)
             timeoutput = set_hour + set_minutes
             self.dismiss()
             return dayoutput,timeoutput
          except ValueError:
            wrongtime.text = "[color=#FF0000]Please enter a valid 
                             datetime.[/color]"

      else:
         wrongtime.text = "[color=#FF0000]Please enter a valid 
         date[/color]"


class VariesTimeScreen(Screen):

  def __init__(self, **kwargs):
    super(VariesTimeScreen, self).__init__(**kwargs)

    a = '_icons_/mcdonald.png'
    b = '_icons_/kfc.png'
    c = '_icons_/subway.png'

    Outlet_Store = [a,b,c]
    layout = GridLayout(rows=1, spacing=100, size_hint_y=None, 
                     pos_hint ={"top":.6,"x":0.2})
    layout.bind(minimum_height=layout.setter('height'))

            #Before the for loop there will be an if statement which is 
            the Day and Time i get from getDay() values. This part i'm 
            unsure how to retrieve the values from the SetDateTime Class

            for image in Outlet_Store: 
               food_image = ImageButton(size_hint=(None, None),size= 
                            (100,100),source=image)

               layout.add_widget(food_image)
            self.add_widget(layout)

您设计的一个问题是 VariesTimeScreen 是在 App 运行 的早期创建的,就像创建 GUI 时一样。因此,SetDateTime Popup 中的日期和时间尚不可用。处理此问题的一种方法是向 VariesTimeScreen 添加一个 on_enter() 方法,以便在那时对 Screen 进行任何调整。为此,我将 Properties 添加到 VariesTimeScreen:

class VariesTimeScreen(Screen):
    day = StringProperty('None')
    time = NumericProperty(0)

并将on_enter()方法添加到VariesTimeScreen class:

def on_enter(self, *args):
    print('day:', self.day, ', time:', self.time)
    # make changes to the Screen

然后稍微改变SetDateTime class:

class SetDateTime(Popup):

    def getDay(self):
        set_day = (self.ids.dayofmonth).text
        set_month = (self.ids.month).text
        set_year = (self.ids.year).text

        set_hour = (self.ids.houroftime).text
        set_minutes = (self.ids.minuteoftime).text

        wrongtime = self.ids.wronginput_time

        # Calculate Date and Time only when user input a valid number
        if set_day.isdigit() and set_month.isdigit() and set_year.isdigit() and set_hour.isdigit() and set_minutes.isdigit():
            try:
                set_date = datetime.date(int(set_year),
                                         int(set_month), int(set_day))
                set_time = datetime.time(int(set_hour), int(set_minutes))

                if not (set_date >= counttime.todaydate()):
                    wrongtime.text = "[color=#FF0000]Date is out of range[ / color]"
                    if not (set_time >= counttime.todaytime()):
                        wrongtime.text = "[color=#FF0000]Time is out of range[ / color]"

                dayoutput = counttime.calculatedate(set_date)
                timeoutput = set_hour + set_minutes

                # get the VariesTimeScreen
                varies_time = App.get_running_app().root.ids.screen_manager.get_screen('variestime_screen')

                # set the day and time for the VariesTimeScreen
                varies_time.day = dayoutput
                varies_time.time = timeoutput

                # switch to the VariesTimeScreen
                App.get_running_app().change_screen('variestime_screen')

                # dismiss Popup
                self.dismiss()
            except ValueError:
                wrongtime.text = "[color=#FF0000]Please enter a valid datetime.[ / color]"

        else:
            wrongtime.text = "[color=#FF0000]Please enter a valid date[ / color]"

唯一的变化是在VariesTimeScreen中设置daytime,并实际切换到VariesTimeScreen。切换到 VariesTimeScreen 不必在那里发生,一旦设置了 daytime,只要 on_enter() 方法成为当前 Screen.