diff options
| author | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-01-01 11:40:09 +0000 |
|---|---|---|
| committer | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-01-01 11:40:09 +0000 |
| commit | 7ed83b6c6666eb8b6b104c211ae7e52907350372 (patch) | |
| tree | 4430b556abac0ad660a0aacf1887d77f85d8be02 /scribus/plugins/scriptplugin/scripts/CalendarWizard.py | |
| download | scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.gz scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.xz scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.zip | |
Branch 1.3.5 tree to 1.4.x tree, goodbye 1.3.x
git-svn-id: svn://scribus.net/branches/Version14x/Scribus@17163 11d20701-8431-0410-a711-e3c959e3b870
Diffstat (limited to 'scribus/plugins/scriptplugin/scripts/CalendarWizard.py')
| -rw-r--r-- | scribus/plugins/scriptplugin/scripts/CalendarWizard.py | 670 |
1 files changed, 670 insertions, 0 deletions
diff --git a/scribus/plugins/scriptplugin/scripts/CalendarWizard.py b/scribus/plugins/scriptplugin/scripts/CalendarWizard.py new file mode 100644 index 0000000..8b46eba --- /dev/null +++ b/scribus/plugins/scriptplugin/scripts/CalendarWizard.py @@ -0,0 +1,670 @@ +# -*- coding: utf-8 -*- + +""" This is a simple 'Calendar creation wizard' for Scribus. It's a fully +rewritten Calender.py from Scribus examples. Enjoy. + +DESCRIPTION & USAGE: +This script needs Tkinter. It will create a GUI with available options +for easy calendar page creation. You'll get new pages with calendar +tables into a new document you are asked for. Position of the +objects in page is calculated with the "golden-ratio" aspect from the +page margins. + +Steps to create: + 1) Fill requested values in the Calendar dialog + 2) You will be prompted for new document + 3) You will be prompted for new paragraph style which will be used + in calendar text frames. It could be changed later. + +There are 2 types of calendar supported: + 1) Classic calendar with one month matrix per page. I suggest + here PORTRAIT orientation. + 2) Horizontal event calendar with one week per page with huge place + for human inputs. There should be LANDSCAPE imho. + 3) Horizontal event calendar with one week per page with huge place + for human inputs. There should be LANDSCAPE imho. + +But everything works with both orientations well of course too. + +AUTHORS: + Petr Vanek <petr@scribus.info> + Bernhard Reiter <ockham@raz.or.at> + +LICENSE: +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +""" + +import sys +import calendar +import datetime + +try: + from scribus import * +except ImportError: + print "This Python script is written for the Scribus scripting interface." + print "It can only be run from within Scribus." + sys.exit(1) + +try: + # I wish PyQt installed everywhere :-/ + from Tkinter import * + from tkFont import Font +except ImportError: + print "This script requires Python's Tkinter properly installed." + messageBox('Script failed', + 'This script requires Python\'s Tkinter properly installed.', + ICON_CRITICAL) + sys.exit(1) + + +localization = { +'Catalan' : + [['Gener', 'Febrer', 'Març', 'Abril', 'Maig', + 'Juny', 'Juliol', 'Agost', 'Setembre', + 'Octubre', 'Novembre', 'Desembre'], + ['Dilluns', 'Dimarts', 'Dimecres', 'Dijous', 'Divendres', 'Dissabte', 'Diumenge']], +'Catalan-short' : + [['Gener', 'Febrer', 'Març', 'Abril', 'Maig', + 'Juny', 'Juliol', 'Agost', 'Setembre', + 'Octubre', 'Novembre', 'Desembre'], + ['Dl', 'Dm', 'Dc', 'Dj', 'Dv', 'Ds', 'Dg']], +# Catalan by "Cesc Morata" <atarom@gmail.com> +'Czech' : + [['Leden', 'Únor', 'Březen', 'Duben', 'Květen', + 'Červen', 'Červenec', 'Srpen', 'Září', + 'Říjen', 'Listopad', 'Prosinec'], + ['Pondělí','Úterý','Středa','Čtvrtek','Pátek','Sobota', 'Neděle']], +'Czech-short' : + [['Leden', 'Únor', 'Březen', 'Duben', 'Květen', + 'Červen', 'Červenec', 'Srpen', 'Září', + 'Říjen', 'Listopad', 'Prosinec'], + ['Po', 'Út', 'St', 'Čt', 'Pá', 'So', 'Ne']], +# Croatian by daweed +'Croatian' : + [['Siječanj', 'Veljača', 'Ožujak', 'Travanj', 'Svibanj', + 'Lipanj', 'Srpanj', 'Kolovoz', 'Rujan', + 'Listopad', 'Studeni', 'Prosinac'], + ['Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota', 'Nedjelja']], + +'Dutch' : + [['Januari', 'Februari', 'Maart', 'April', + 'Mei', 'Juni', 'Juli', 'Augustus', 'September', + 'Oktober', 'November', 'December'], + ['Maandag','Dinsdag','Woensdag','Donderdag','Vrijdag','Zaterdag', 'Zondag']], +# Dutch by "Christoph Schäfer" <christoph-schaefer@gmx.de> +'English' : + [['January', 'February', 'March', 'April', + 'May', 'June', 'July', 'August', 'September', + 'October', 'November', 'December'], + ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday', 'Sunday']], +'English-short' : + [['January', 'February', 'March', 'April', 'May', + 'June', 'July', 'August', 'September', 'October', + 'November', 'December'], + ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']], +'Finnish' : + [['Tammikuu', 'Helmikuu', 'Maaliskuu', 'Huhtikuu', + 'Toukokuu', 'Kesäkuu', 'Heinäkuu', 'Elokuu', 'Syyskuu', + 'Lokakuu', 'Marraskuu', 'Joulukuu'], + ['ma','ti','ke','to','pe','la', 'su']], +'French': + [['Janvier', u'F\xe9vrier', 'Mars', 'Avril', + 'Mai', 'Juin', 'Juillet', u'Ao\xfbt', 'Septembre', + 'Octobre', 'Novembre', u'D\xe9cembre'], + ['Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi','Dimanche']], +'German' : + [['Januar', 'Februar', u'M\xe4rz', 'April', + 'Mai', 'Juni', 'Juli', 'August', 'September', + 'Oktober', 'November', 'Dezember'], + ['Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag','Sonntag']], +'German (Austrian)' : + [[u'J\xe4nner', 'Feber', u'M\xe4rz', 'April', + 'Mai', 'Juni', 'Juli', 'August', 'September', + 'Oktober', 'November', 'Dezember'], + ['Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag','Sonntag']], +# Hungarian by Gergely Szalay szalayg@gmail.com +'Hungarian' : + [['Január', 'Február', 'Március', 'Április', + 'Május', 'Június', 'Július', 'Augusztus', 'Szeptember', + 'Október', 'November', 'December'], + ['Hétfő','Kedd','Szerda','Csütörtök','Péntek','Szombat','Vasárnap']], +'Italian' : + [['Gennaio', 'Febbraio', 'Marzo', 'Aprile', + 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', + 'Ottobre', 'Novembre', 'Dicembre'], + [u'Luned\xec', u'Marted\xec', u'Mercoled\xec', u'Gioved\xec', u'Venerd\xec', 'Sabato', 'Domenica']], +# Norwegian by Joacim Thomassen joacim@net.homelinux.org +'Norwegian' : + [['Januar', 'Februar','Mars', 'April','Mai', 'Juni','Juli', 'August','September', 'Oktober', 'November', 'Desember'], + ['Mandag', 'Tirsdag','Onsdag', 'Torsdag','Fredag', 'Lørdag','Søndag']], +# Polish by "Łukasz [DeeJay1] Jernaś" <deejay1@nsj.srem.pl> +'Polish' : + [['Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', + 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', + 'Październik', 'Listopad', 'Grudzień'], + ['Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota', 'Niedziela']], +'Portuguese' : + [['Janeiro', 'Fevereiro', u'Mar\xe7o', 'Abril', + 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', + 'Outubro', 'Novembro', 'Dezembro'], + ['Segunda-feira', u'Ter\xe7a-feira', 'Quarta-feira', 'Quinta-feira', 'Sexta-feira', u'S\xe1bado', 'Domingo']], +# Romanian by Costin Stroie <costinstroie@eridu.eu.org> +'Romanian' : + [['Ianuarie', 'Februarie', 'Martie', 'Aprilie', + 'Mai', 'Iunie', 'Iulie', 'August', 'Septembrie', + 'Octombrie', 'Noiembrie', 'Decembrie'], + ['Luni','Mar\xc8\x9bi','Miercuri','Joi','Vineri','S\xc3\xa2mb\xc4\x83t\xc4\x83', 'Duminic\xc4\x83']], +'Russian' : + [['Январь', 'Февраль', 'Март', 'Апрель', + 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', + 'Октябрь', 'Ноябрь', 'Декабрь'], + ['Понедельник','Вторник','Среда','Четверг','Пятница','Суббота', 'Воскресенье']], +'Slovak' : + [['Január', 'Február', 'Marec', 'Apríl', + 'Máj', 'Jún', 'Júl', 'August', 'September', + 'Október', 'November', 'December'], + ['Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota', 'Nedeľa']], +'Slovak-short' : + [['Január', 'Február', 'Marec', 'Apríl', + 'Máj', 'Jún', 'Júl', 'August', 'September', + 'Október', 'November', 'December'], + ['Po','Ut','St','Št','Pi','So', 'Ne']], +'Spanish' : + [['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', + 'Junio', 'Julio', 'Agosto', 'Septiembre', + 'Octubre', 'Noviembre', 'Diciembre'], + ['Lunes', 'Martes', u'Mi\xe9rcoles', 'Jueves', 'Viernes', u'S\xe1bado', 'Domingo']], +'Swedish' : + [['Januari', 'Februari','Mars', 'April','Maj', 'Juni','Juli', 'Augusti','September', 'Oktober', 'November', 'December'], + ['Måndag', 'Tisdag','Onsdag', 'Torsdag','Fredag', 'Lördag','Söndag']] +} + + +from math import sqrt + +class ScCalendar: + """ Parent class for all calendar types """ + + def __init__(self, year, months=[], firstDay=calendar.SUNDAY, drawSauce=True, sepMonths='/', lang='English'): + """ Setup basic things """ + # params + self.drawSauce = drawSauce # draw supplementary image? + self.year = year + self.months = months + self.lang = lang + # day order + self.dayOrder = localization[self.lang][1] + if firstDay == calendar.SUNDAY: + dl = self.dayOrder[:6] + dl.insert(0, self.dayOrder[6]) + self.dayOrder = dl + self.mycal = calendar.Calendar(firstDay) + self.layerImg = 'Calendar image' + self.layerCal = 'Calendar' + self.pStyleDate = "Date" # paragraph styles + self.pStyleWeekday = "Weekday" + self.pStyleMonth = "Month" + self.pStyleWeekNo = "WeekNo" + self.masterPage = "Weekdays" + self.sepMonths = sepMonths + # settings + self.firstPage = True # create only 2nd 3rd ... pages. No 1st one. + calendar.setfirstweekday(firstDay) + progressTotal(len(months)) + + def setupDocVariables(self): + """ Compute base metrics here. Page layout is bordered by margins and + virtually divided by golden mean 'cut' in the bottom. The calendar is + in the bottom part - top is occupied with empty image frame. """ + page = getPageSize() + self.pagex = page[0] + self.pagey = page[1] + marg = getPageMargins() + # See http://docs.scribus.net/index.php?lang=en&page=scripterapi-page#-getPageMargins + self.margint = marg[0] + self.marginl = marg[1] + self.marginr = marg[2] + self.marginb = marg[3] + self.width = self.pagex - self.marginl - self.marginr + self.height = self.pagey - self.margint - self.marginb + + def goldenMean(self, aSize): + """ Taken from samples/golden-mean.py.""" + return aSize * ((sqrt(5) - 1)/2) + + def applyTextToFrame(self, aText, aFrame): + """ Insert the text with style. """ + setText(aText, aFrame) + setStyle(self.pStyleDate, aFrame) + + def createCalendar(self): + """ Walk through months dict and call monthly sheet """ + if not newDocDialog(): + return 'Create a new document first, please' + createParagraphStyle(name=self.pStyleDate, alignment=ALIGN_RIGHT) + createParagraphStyle(name=self.pStyleWeekday, alignment=ALIGN_RIGHT) + createParagraphStyle(name=self.pStyleMonth) + createParagraphStyle(name=self.pStyleWeekNo, alignment=ALIGN_RIGHT) + originalUnit = getUnit() + setUnit(UNIT_POINTS) + self.setupDocVariables() + if self.drawSauce: + createLayer(self.layerImg) + createLayer(self.layerCal) + self.setupMasterPage() + run = 0 + for i in self.months: + run += 1 + progressSet(run) + cal = self.mycal.monthdatescalendar(self.year, i + 1) + self.createMonthCalendar(i, cal) + setUnit(originalUnit) + return None + + def createLayout(self): + """ Create the page and optional bells and whistles around """ + self.createPage() + if self.drawSauce: + setActiveLayer(self.layerImg) + self.createImage() + setActiveLayer(self.layerCal) + + def createPage(self): + """ Wrapper to the new page with layers """ + if self.firstPage: + self.firstPage = False + newPage(-1, self.masterPage) # create a new page using the masterPage + deletePage(1) # now it's safe to delete the first page + gotoPage(1) + return + newPage(-1, self.masterPage) + +class ScEventCalendar(ScCalendar): + """ Parent class for event + (horizontal event, vertical event) calendar types """ + + def __init__(self, year, months = [], firstDay = calendar.SUNDAY, drawSauce=True, sepMonths='/', lang='English'): + ScCalendar.__init__(self, year, months, firstDay, drawSauce, sepMonths, lang) + + def printMonth(self, cal, month, week): + """ Print the month name(s) """ + if week[6].day < 7: + if (week == cal[len(cal)-1]): + self.createHeader(localization[self.lang][0][month] + self.sepMonths + localization[self.lang][0][(month+1)%12]) + elif ((month-1) not in self.months): + self.createHeader(localization[self.lang][0][(month-1)%12] + self.sepMonths + localization[self.lang][0][month]) + else: + self.createHeader(localization[self.lang][0][month]) + + def createMonthCalendar(self, month, cal): + """ Draw one week calendar per page """ + for week in cal: + # Avoid duplicate week around the turn of the months: + # Only include week: + # * If it's not the first week in a month, or, if it is: + # * If it starts on the first weekday + # * If the month before it isn't included + if (week != cal[0]) or (week[0].day == 1) or ((month-1) not in self.months): + self.createLayout() + self.printMonth(cal, month, week) + self.printWeekNo(week) + + for day in week: + self.printDay(day) + +class ScHorizontalEventCalendar(ScEventCalendar): + """ One day = one row calendar. I suggest LANDSCAPE orientation.\ + One week per page.""" + + def __init__(self, year, months = [], firstDay = calendar.SUNDAY, drawSauce=True, sepMonths='/', lang='English'): + ScEventCalendar.__init__(self, year, months, firstDay, drawSauce, sepMonths, lang) + + def setupDocVariables(self): + """ Compute base metrics here. Page layout is bordered by margins and + virtually divided by golden mean 'cut' in the bottom. The calendar is + in the bottom part - top is occupied with empty image frame. """ + # golden mean + ScCalendar.setupDocVariables(self) + self.gmean = self.width - self.goldenMean(self.width) + self.marginl + # calendar size = gmean + # rows and cols + self.rowSize = self.height / 8 + + def printWeekNo(self, week): + """ Dummy for now + (for this type of calendar - see ScVerticalEventCalendar) """ + return + + def printDay(self, j): + """ Print a given day """ + cel = createText(self.gmean + self.marginl, + self.margint + (1 + (j.weekday()-calendar.firstweekday())%7) * self.rowSize, + self.width - self.gmean, self.rowSize) + setText(str(j.day), cel) + setStyle(self.pStyleDate, cel) + + def createHeader(self, monthName): + """ Draw calendar header: Month name """ + cel = createText(self.gmean + self.marginl, self.margint, + self.width - self.gmean, self.rowSize) + setText(monthName, cel) + setStyle(self.pStyleMonth, cel) + + def createImage(self): + """ Wrapper for everytime-the-same image frame. """ + if self.drawSauce: + createImage(self.marginl, self.margint, self.gmean, self.height) + + def setupMasterPage(self): + """ Create a master page (not used for this type of calendar """ + createMasterPage(self.masterPage) + closeMasterPage() + +class ScVerticalCalendar(ScCalendar): + """ Parent class for vertical + (classic, vertical event) calendar types """ + + def __init__(self, year, months = [], firstDay = calendar.SUNDAY, drawSauce=True, sepMonths='/', lang='English'): + ScCalendar.__init__(self, year, months, firstDay, drawSauce, sepMonths, lang) + + def setupDocVariables(self): + """ Compute base metrics here. Page layout is bordered by margins and + virtually divided by golden mean 'cut' in the bottom. The calendar is + in the bottom part - top is occupied with empty image frame. """ + # gloden mean + ScCalendar.setupDocVariables(self) + self.gmean = self.height - self.goldenMean(self.height) + self.margint + # calendar size + self.calHeight = self.height - self.gmean + self.margint + # rows and cols + self.rowSize = self.gmean / 8 + self.colSize = self.width / 7 + + def setupMasterPage(self): + """ Draw invariant calendar header: Days of the week """ + createMasterPage(self.masterPage) + editMasterPage(self.masterPage) + setActiveLayer(self.layerCal) + rowCnt = 0 + for j in self.dayOrder: # days + cel = createText(self.marginl + rowCnt*self.colSize, + self.calHeight + self.rowSize, + self.colSize, self.rowSize) + setText(j, cel) + setStyle(self.pStyleWeekday, cel) + rowCnt+=1 + closeMasterPage() + + def createHeader(self, monthName): + """ Draw calendar header: Month name """ + header = createText(self.marginl, self.calHeight, self.width, self.rowSize) + setText(monthName, header) + setStyle(self.pStyleMonth, header) + + def createImage(self): + """ Wrapper for everytime-the-same image frame. """ + if self.drawSauce: + createImage(self.marginl, self.margint, + self.width, self.calHeight - self.margint) + +class ScClassicCalendar(ScVerticalCalendar): + """ Calendar matrix creator itself. I suggest PORTRAIT orientation. + One month per page.""" + + def __init__(self, year, months = [], firstDay = calendar.SUNDAY, drawSauce=True, sepMonths='/', lang='English'): + ScVerticalCalendar.__init__(self, year, months, firstDay, drawSauce, sepMonths, lang) + + def createMonthCalendar(self, month, cal): + """ Create a page and draw one month calendar on it """ + self.createLayout() + self.createHeader(localization[self.lang][0][month]) + rowCnt = 2 + for week in cal: + colCnt = 0 + for day in week: + cel = createText(self.marginl + colCnt * self.colSize, + self.calHeight + rowCnt * self.rowSize, + self.colSize, self.rowSize) + colCnt += 1 + if day.month == month + 1: + setText(str(day.day), cel) + setStyle(self.pStyleDate, cel) + rowCnt += 1 + +class ScVerticalEventCalendar(ScVerticalCalendar, ScEventCalendar): + """ One day = one column calendar. I suggest LANDSCAPE orientation.\ + One week per page.""" + + def __init__(self, year, months = [], firstDay = calendar.SUNDAY, drawSauce=True, sepMonths='/', lang='English'): + ScVerticalCalendar.__init__(self, year, months, firstDay, drawSauce, sepMonths, lang) + ScEventCalendar.__init__(self, year, months, firstDay, drawSauce, sepMonths, lang) + + def printDay(self, j): + """ Print a given day """ + cel = createText(self.marginl + ((j.weekday()-calendar.firstweekday())%7)*self.colSize, + self.calHeight + self.rowSize, + self.colSize/5, self.rowSize) + setText(str(j.day), cel) + setStyle(self.pStyleDate, cel) + + def printWeekNo(self, week): + """ Print the week number for the given week""" + weekCel = createText(self.marginl, self.calHeight, self.width, self.rowSize) + # Week number: of this week's Thursday. + # See http://docs.python.org/library/datetime.html#datetime.date.isocalendar + # Note that week calculation isn't perfectly universal yet: + # http://en.wikipedia.org/wiki/Week_number#Week_number + setText(str(week[(calendar.THURSDAY-calendar.firstweekday())%7].isocalendar()[1]), weekCel) + setStyle(self.pStyleWeekNo, weekCel) + +class TkCalendar(Frame): + """ GUI interface for Scribus calendar wizard. + It's ugly and very simple. I can say I hate Tkinter :-/""" + + def __init__(self, master=None): + """ Setup the dialog """ + # reference to the localization dictionary + self.key = 'English' + Frame.__init__(self, master) + self.grid() + self.master.resizable(0, 0) + self.master.title('Scribus Calendar Wizard') + #define widgets + self.statusVar = StringVar() + self.statusLabel = Label(self, textvariable=self.statusVar) + self.statusVar.set('Select Options and Values') + # langs + # change the height = to match number of langs. + self.langLabel = Label(self, text='Select language:') + + self.langFrame = Frame(self) + self.langFrame.pack() + self.langScrollbar = Scrollbar(self.langFrame) + self.langScrollbar.pack(fill=Y, side=RIGHT) + self.langListbox = Listbox(self.langFrame, selectmode=SINGLE, height=10, yscrollcommand=self.langScrollbar.set) + self.langListbox.pack(fill=X,side=LEFT) + self.langScrollbar.config(command=self.langListbox.yview) + + keys = localization.keys() + keys.sort() + for i in keys: + self.langListbox.insert(END, i) + self.langButton = Button(self, text='Change language', command=self.languageChange) + # calendar type + self.typeLabel = Label(self, text='Calendar type') + self.typeVar = IntVar() + self.typeClRadio = Radiobutton(self, text='Classic', variable=self.typeVar, value=0) + self.typeEvRadio = Radiobutton(self, text='Event (Horizontal)', variable=self.typeVar, value=1) + self.typeVERadio = Radiobutton(self, text='Event (Vertical)', variable=self.typeVar, value=2) + # start of week + self.weekStartsLabel = Label(self, text='Week begins with:') + self.weekVar = IntVar() + self.weekMondayRadio = Radiobutton(self, text='Mon', variable=self.weekVar, value=calendar.MONDAY) + self.weekSundayRadio = Radiobutton(self, text='Sun', variable=self.weekVar, value=calendar.SUNDAY) + # year + self.yearLabel = Label(self, text='Year:') + self.yearVar = StringVar() + self.yearEntry = Entry(self, textvariable=self.yearVar, width=4) + self.wholeYearLabel = Label(self, text='Whole year:') + self.wholeYear = IntVar() + self.wholeYearCheck = Checkbutton(self, command=self.setWholeYear, variable=self.wholeYear) + # months + self.monthLabel = Label(self, text='Months:') + self.monthListbox = Listbox(self, selectmode=MULTIPLE, height=12) + # layout stuff + self.imageLabel = Label(self, text='Draw Image Frame:') + self.imageVar = IntVar() + self.imageCheck = Checkbutton(self, variable=self.imageVar) + # Months separator + self.sepMonthsLabel = Label(self, text='Months separator:') + self.sepMonthsVar = StringVar() + self.sepMonthsEntry = Entry(self, textvariable=self.sepMonthsVar, width=4) + # closing/running + self.okButton = Button(self, text="OK", width=6, command=self.okButonn_pressed) + self.cancelButton = Button(self, text="Cancel", command=self.quit) + # setup values + self.weekMondayRadio.select() + self.typeClRadio.select() + self.yearVar.set(str(datetime.date(1, 1, 1).today().year)) + self.sepMonthsVar.set('/') + self.imageCheck.select() + # make layout + self.columnconfigure(0, pad=6) + currRow = 0 + self.statusLabel.grid(column=0, row=currRow, columnspan=4) + currRow += 1 + self.langLabel.grid(column=0, row=currRow, sticky=W) + self.monthLabel.grid(column=3, row=currRow, sticky=W) + currRow += 1 + self.langFrame.grid(column=0, row=currRow, rowspan=6, sticky=N) + self.typeLabel.grid(column=1, row=currRow, sticky=E) + self.typeClRadio.grid(column=2, row=currRow, sticky=W) + self.monthListbox.grid(column=3, row=currRow, rowspan=8) + currRow += 1 + self.typeEvRadio.grid(column=2, row=currRow, sticky=W) + currRow += 1 + self.typeVERadio.grid(column=2, row=currRow, sticky=W) + currRow += 1 + self.weekStartsLabel.grid(column=1, row=currRow, sticky=N+E) + self.weekMondayRadio.grid(column=2, row=currRow, sticky=N+W) + currRow += 1 + self.weekSundayRadio.grid(column=2, row=currRow, sticky=N+W) + currRow += 1 + self.yearLabel.grid(column=1, row=currRow, sticky=N+E) + self.yearEntry.grid(column=2, row=currRow, sticky=N+W) + currRow += 1 + self.wholeYearLabel.grid(column=1, row=currRow, sticky=N+E) + self.wholeYearCheck.grid(column=2, row=currRow, sticky=N+W) + currRow += 1 + self.imageLabel.grid(column=1, row=currRow, sticky=N+E) + self.imageCheck.grid(column=2, row=currRow, sticky=N+W) + self.langButton.grid(column=0, row=currRow) + currRow += 1 + self.sepMonthsLabel.grid(column=1, row=currRow, sticky=N+E) + self.sepMonthsEntry.grid(column=2, row=currRow, sticky=N+W) + currRow += 3 + self.rowconfigure(currRow, pad=6) + self.okButton.grid(column=1, row=currRow, sticky=E) + self.cancelButton.grid(column=2, row=currRow, sticky=W) + # fill the values + self.realLangChange() + + def languageChange(self, lang='English'): + """ Called by Change button. Get language list value and + call real re-filling. """ + ix = self.langListbox.curselection() + if len(ix)==0: + self.statusVar.set('Select a language, please') + return + self.realLangChange(lang=self.langListbox.get(ix[0])) + + def realLangChange(self, lang='English'): + """ Real widget setup. Ot takes values from localization dictionary. + [0] = months, [1] Days """ + self.key = lang + self.monthListbox.delete(0, END) + self.wholeYear.set(0) + for i in localization[lang][0]: + self.monthListbox.insert(END, i) + + def setWholeYear(self): + """ All/none months selection. It's called after "Whole year" check button + click. """ + if self.wholeYear.get() == 1: + self.monthListbox.selection_set(0, END) + else: + self.monthListbox.selection_clear(0, END) + + def okButonn_pressed(self): + """ User variables testing and preparing """ + # year + try: + year = self.yearVar.get().strip() + if len(year) != 4: + raise ValueError + year = int(year, 10) + except ValueError: + self.statusVar.set('Year must be in the "YYYY" format e.g. 2005.') + return + # months + selMonths = self.monthListbox.curselection() + if len(selMonths) == 0: + self.statusVar.set('At least one month must be selected.') + return + months = [] + for i in selMonths: + months.append(int(i)) + # draw images etc. + if self.imageVar.get() == 0: + draw = False + else: + draw = True + # create calendar (finally) + if self.typeVar.get() == 0: + cal = ScClassicCalendar(year, months, self.weekVar.get(), draw, self.sepMonthsVar.get(), self.key) + elif self.typeVar.get() == 1: + cal = ScHorizontalEventCalendar(year, months, self.weekVar.get(), draw, self.sepMonthsVar.get(), self.key) + else: + cal = ScVerticalEventCalendar(year, months, self.weekVar.get(), draw, self.sepMonthsVar.get(), self.key) + self.master.withdraw() + err = cal.createCalendar() + if err != None: + self.master.deiconify() + self.statusVar.set(err) + else: + self.quit() + + def quit(self): + self.master.destroy() + + +def main(): + """ Application/Dialog loop with Scribus sauce around """ + try: + statusMessage('Running script...') + progressReset() + root = Tk() + app = TkCalendar(root) + root.mainloop() + finally: + if haveDoc(): + redrawAll() + statusMessage('Done.') + progressReset() + +if __name__ == '__main__': + main() + |
