2014-03-12 5 views
0

Я пытаюсь создать небольшой графический интерфейс с помощью Kivy. Я хочу создать небольшое всплывающее окно календаря с кнопками изменения месяца в заголовке, но заголовок будет принимать только строку, так как это StringProperty. Мне интересно переписать StringProperty с ObjectProperty, чтобы я мог добавлять кнопки в заголовок, но не могу понять.Overwrite Property

Вот мой пример кода с названием набора текст только, но содержание я хотел бы построен в lay_title:

import kivy 
kivy.require('1.4.0') 

from kivy.app import App 
from kivy.uix.popup import Popup 
from kivy.uix.button import Button 
from kivy.uix.togglebutton import ToggleButton 
from kivy.uix.label import Label 
from kivy.uix.gridlayout import GridLayout 
import calendar 



class DatePicker(Popup): 
    def __init__(self, *args, **kwargs): 

     #We allow the super class Popup to run it's normal things here 
     super(DatePicker, self).__init__(**kwargs) 

     #Target Month and Year to display 
     # 
     DisplayMonth = 3 
     DisplayYear = 2014 

     self.day = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ] 
     self.month = [ 'January', 'Feburary', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ] 

     self.dy = calendar.monthcalendar(DisplayYear, DisplayMonth) 

     lay_cal = GridLayout(cols=7) 

     # Fill top row with Day names in bold with makeup 
     for d in self.day: 
      b = Label(text = '[b]'+d+'[/b]' , markup=True) 
      lay_cal.add_widget(b) 

     # Fill the dates using the list returned from calendar.monthcalendar 
     for wk in range(len(self.dy)): 
      for d in range(0,7):  
       dateOfWeek = self.dy[wk][d] 
       if not dateOfWeek == 0: 
        b = ToggleButton(text = str(dateOfWeek)) 
        b.bind(state = self.on_button_change) 
       else: 
        b = Label(text = '') 
       lay_cal.add_widget(b) 

     #Set the title if it wasnt pass as an argument 
     if not kwargs.has_key("title"): 


      #Create Title with Buttons 
      lay_title = GridLayout(cols=3) 

      b = Button(text = "<") 
      b.bind(on_release = self.on_month_back) 
      lay_title.add_widget(b) 

      b = Label(text = self.month[DisplayMonth-1] + ", " + str(DisplayYear)) 
      lay_title.add_widget(b) 
      b = Button(text = ">") 
      b.bind(on_release = self.on_month_forward) 
      lay_title.add_widget(b) 


      #Create Text Title 
      self.title = self.month[DisplayMonth-1] + ", " + str(DisplayYear) 

     #Set the content to the layout 
     if not kwargs.has_key("content"): 
      self.content = lay_cal 

     #Set the size 
     if not kwargs.has_key("size") and not kwargs.has_key("size_hint"): 
      self.size = (500,400) 
      self.size_hint = (None,None) 

    def on_button_change(self, instance, value): 
     print "Date clicked: ", instance.text 
     print "State: ", value 
     # self.dismiss() 

    def on_month_back(self,instance): 
     print "Pressed back month" 

    def on_month_forward(self,instance): 
     print "Pressed Forward Month" 

    def on_dismiss(self, *arg, **kwargs): 
     #Pass to super of Popup on_dismiss 
     super(DatePicker, self).on_dismiss(**kwargs) 

     # Do the following too! 
     print "Closed Popup" 




class CalendarApp(App): 
    def build(self): 
     date = DatePicker() 

     date.open() 


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

Любая помощь будет оценена.

ответ

2

Вы не можете просто переопределить заголовок, как это, потому что Popup строятся с конкретным определением языка киловольт, опираясь на текст, имеющие там с определенным размером и т.д.

Вместо этого вы можете построить свое собственное всплывающее окно с помощью ModalView. Это обрабатывает всплывающее поведение (точно так же, как Popup, который сам подклассы ModalView), но не имеет предопределенной структуры заголовка, поэтому вы можете создать свой собственный стиль.

+0

Одна вещь, которую я замечаю, заключается в том, что мои макеты расширяют область «Модальное представление». Использование подсказки размера может исправить это, но есть ли способ посмотреть конкретный источник определения языка kv класса «Popup»? –

+0

Да, см. Https://github.com/kivy/kivy/blob/master/kivy/data/style.kv#L462 – inclement