Avión
Avión

Reputation: 8395

Tkinter issue trying to show calendar dates with StringVars

I'm doing a UI where the user have to select some in-dates and out-dates. In-dates is when an order comes to a factory, and out-dates is when he wants to recieve the order.

The problem I'm having is that when I click on one in-date and select a date from the calendar, all the in-dates get filled with this same date:

enter image description here

The code looks long but it isn't. More than a half of the code is a caldendar code (from the following code from class TkcClendar to the bottom) and you dont need even to see it to help me.

# -*- coding: utf-8 -*-
import os
from Tkinter import *
import Image
import ImageTk
import tkFileDialog
import xlrd
import csv
from tkMessageBox import *
from win32com.client import Dispatch
import datetime
import time
import calendar

year = time.localtime()[0]
month = time.localtime()[1]
day =time.localtime()[2]
strdate = (str(year) +  "/" + str(month) + "/" + str(day))

fnta = ("Helvetica", 10)
fnt = ("Helvetica", 10)
fntc = ("Helvetica", 10, 'bold')

lang="span"

if lang == "span":
    #Spanish Options
    strtitle = "Calendario"
    strdays= "Do  Lu  Ma  Mi  Ju  Vi  Sa"
    dictmonths = {'1':'Ene','2':'Feb','3':'Mar','4':'Abr','5':'May',
    '6':'Jun','7':'Jul','8':'Ago','9':'Sep','10':'Oct','11':'Nov',
    '12':'Dic'}
else :
    #English Options
    strtitle = "Calendar"
    strdays = "Su  Mo  Tu  We  Th  Fr  Sa"
    dictmonths = {'1':'Jan','2':'Feb','3':'Mar','4':'Apr','5':'May',
    '6':'Jun','7':'Jul','8':'Aug','9':'Sep','10':'Oct','11':'Nov',
    '12':'Dec'}

class Planificador(Frame):
    def __init__(self,master):
        Frame.__init__(self, master)
        self.master = master
        self.initUI()

    def initUI(self):
        self.master.title("Planner")
        self.frameOne = Frame(self.master)
        self.frameOne.grid(row=0,column=0)
        self.frameTwo = Frame(self.master)
        self.frameTwo.grid(row=0, column=1)

        self.frameThree = Frame(self.master)
        self.frameThree.grid(row=0, column=2)
        self.frameFour = Frame(self.master)
        self.frameFour.grid(row=1,column=0)
        self.frameFive = Frame(self.master)
        self.frameFive.grid(row=1, column=1)
        self.frameSix = Frame(self.master)
        self.frameSix.grid(row=1, column=2)
        self.frameSeven = Frame(self.master)
        self.frameSeven.grid(row=2,column=0)
        self.frameEight = Frame(self.master)
        self.frameEight.grid(row=2, column=1)
        self.frameNine = Frame(self.master)
        self.frameNine.grid(row=2, column=2)

        self.start_date_menu()

    def start_date_menu(self):
        self.date_num = raw_input("Number of dates?")
        self.n = 1

        self.textoprioridad = Label(self.frameFour, text = "Day in", justify="center")
        self.textoprioridad.grid(row=self.n, column=2)
        self.lotestext = Label(self.frameFour, text = "Day out", justify="center")
        self.lotestext.grid(row=self.n, column=3, padx=(10,0))

        self.textoprioridad = Label(self.frameSix, text = "Day in", justify="center")
        self.textoprioridad.grid(row=self.n, column=2)
        self.lotestext = Label(self.frameSix, text = "Day out", justify="center")
        self.lotestext.grid(row=self.n, column=3, padx=(10,0))

        self.date_var1 = StringVar()
        self.date_var1.set(" day in ")
        self.date_var2 = StringVar()
        self.date_var2.set(" day out")

        while self.n <= int(self.date_num):
            if(int(self.n) % 2) != 0:
                self.fechallegada = Button(self.frameFour, textvariable=self.date_var1, command=lambda:self.fnCalendar(self.date_var1))
                self.fechallegada.grid(row=self.n+1, column=2)
                self.fechasalida = Button(self.frameFour, textvariable=self.date_var2, command=lambda:self.fnCalendar(self.date_var2))
                self.fechasalida.grid(row=self.n+1, column=3)

            else:
                self.fechallegada = Button(self.frameSix, textvariable=self.date_var1, command=lambda:self.fnCalendar(self.date_var1))
                self.fechallegada.grid(row=self.n+1, column=2)
                self.fechasalida = Button(self.frameSix, textvariable= self.date_var2, command=lambda:self.fnCalendar(self.date_var2))
                self.fechasalida.grid(row=self.n+1, column=3)

            self.n += 1
        self.anadirpiezas = Button(self.frameEight, text="add more", command=self.addpieza, width=10)
        self.anadirpiezas.grid(row=0, column=3, pady=(10,10))

    def addpieza(self):
            if(int(self.date_num) % 2) == 0:
                self.fechallegada = Button(self.frameFour, textvariable=self.date_var1, command=lambda:self.fnCalendar(self.date_var1))
                self.fechallegada.grid(row=int(self.date_num)+1, column=2)
                self.fechasalida = Button(self.frameFour, textvariable= self.date_var2, command=lambda:self.fnCalendar(self.date_var2))
                self.fechasalida.grid(row=int(self.date_num)+1, column=3)
            else:
                self.fechallegada = Button(self.frameSix, textvariable=self.date_var1, command=lambda:self.fnCalendar(self.date_var1))
                self.fechallegada.grid(row=int(self.date_num)+1, column=2)
                self.fechasalida = Button(self.frameSix, textvariable= self.date_var2, command=lambda:self.fnCalendar(self.date_var2))
                self.fechasalida.grid(row=int(self.date_num)+1, column=3)

            self.date_num = int(self.date_num)+1

    def fnCalendar(self, datebar):
        tkCalendar(self.master, year, month, day, datebar)

class tkCalendar :
  def __init__ (self, master, arg_year, arg_month, arg_day,
       arg_parent_updatable_var):
    self.update_var = arg_parent_updatable_var
    top = self.top = Toplevel(master)
    top.title("Eleccion de fecha")
    try : self.intmonth = int(arg_month)
    except: self.intmonth = int(1)
    self.canvas =Canvas (top, width =200, height =220,
      relief =RIDGE, background ="#ece9d8", borderwidth =0)
    self.canvas.create_rectangle(0,0,303,30, fill="#ece9d8",width=0 )
    self.canvas.create_text(100,17, text="Elige una fecha",  font=fntc, fill="#BA1111")
    stryear = str(arg_year)

    self.year_var=StringVar()
    self.year_var.set(stryear)
    self.lblYear = Label(top, textvariable = self.year_var,
        font = fnta, background="#ece9d8")
    self.lblYear.place(x=85, y = 30)

    self.month_var=StringVar()
    strnummonth = str(self.intmonth)
    strmonth = dictmonths[strnummonth]
    self.month_var.set(strmonth)

    self.lblYear = Label(top, textvariable = self.month_var,
        font = fnta, background="#ece9d8")
    self.lblYear.place(x=85, y = 50)
    #Variable muy usada
    tagBaseButton = "Arrow"
    self.tagBaseNumber = "DayButton"
    #draw year arrows
    x,y = 40, 43
    tagThisButton = "leftyear"
    tagFinalThisButton = tuple((tagBaseButton,tagThisButton))
    self.fnCreateLeftArrow(self.canvas, x,y, tagFinalThisButton)
    x,y = 150, 43
    tagThisButton = "rightyear"
    tagFinalThisButton = tuple((tagBaseButton,tagThisButton))
    self.fnCreateRightArrow(self.canvas, x,y, tagFinalThisButton)
    #draw month arrows
    x,y = 40, 63
    tagThisButton = "leftmonth"
    tagFinalThisButton = tuple((tagBaseButton,tagThisButton))
    self.fnCreateLeftArrow(self.canvas, x,y, tagFinalThisButton)
    x,y = 150, 63
    tagThisButton = "rightmonth"
    tagFinalThisButton = tuple((tagBaseButton,tagThisButton))
    self.fnCreateRightArrow(self.canvas, x,y, tagFinalThisButton)
    #Print days
    self.canvas.create_text(100,90, text=strdays, font=fnta)
    self.canvas.pack (expand =1, fill =BOTH)
    self.canvas.tag_bind ("Arrow", "<ButtonRelease-1>", self.fnClick)
    self.canvas.tag_bind ("Arrow", "<Enter>", self.fnOnMouseOver)
    self.canvas.tag_bind ("Arrow", "<Leave>", self.fnOnMouseOut)
    self.fnFillCalendar()

  def fnCreateRightArrow(self, canv, x, y, strtagname):
    canv.create_polygon(x,y, [[x+0,y-5], [x+10, y-5] , [x+10,y-10] ,
        [x+20,y+0], [x+10,y+10] , [x+10,y+5] , [x+0,y+5]],
        tags = strtagname , fill="black", width=0)

  def fnCreateLeftArrow(self, canv, x, y, strtagname):
    canv.create_polygon(x,y, [[x+10,y-10], [x+10, y-5] , [x+20,y-5] ,
        [x+20,y+5], [x+10,y+5] , [x+10,y+10] ],
        tags = strtagname , fill="black", width=0)


  def fnClick(self,event):
    owntags =self.canvas.gettags(CURRENT)
    if "rightyear" in owntags:
    intyear = int(self.year_var.get())
    intyear +=1
    stryear = str(intyear)
    self.year_var.set(stryear)
    if "leftyear" in owntags:
    intyear = int(self.year_var.get())
    intyear -=1
    stryear = str(intyear)
    self.year_var.set(stryear)
    if "rightmonth" in owntags:
    if self.intmonth < 12 :
        self.intmonth += 1
        strnummonth = str(self.intmonth)
        strmonth = dictmonths[strnummonth]
        self.month_var.set(strmonth)
    else :
        self.intmonth = 1
        strnummonth = str(self.intmonth)
        strmonth = dictmonths[strnummonth]
        self.month_var.set(strmonth)
        intyear = int(self.year_var.get())
        intyear +=1
        stryear = str(intyear)
        self.year_var.set(stryear)
    if "leftmonth" in owntags:
    if self.intmonth > 1 :
        self.intmonth -= 1
        strnummonth = str(self.intmonth)
        strmonth = dictmonths[strnummonth]
        self.month_var.set(strmonth)
    else :
        self.intmonth = 12
        strnummonth = str(self.intmonth)
        strmonth = dictmonths[strnummonth]
        self.month_var.set(strmonth)
        intyear = int(self.year_var.get())
        intyear -=1
        stryear = str(intyear)
        self.year_var.set(stryear)
    self.fnFillCalendar()
  def fnFillCalendar(self):
    init_x_pos = 20
    arr_y_pos = [110,130,150,170,190,210]
    intposarr = 0
    self.canvas.delete("DayButton")
    self.canvas.update()
    intyear = int(self.year_var.get())
    monthcal = calendar.monthcalendar(intyear, self.intmonth)
    for row in monthcal:
    xpos = init_x_pos
    ypos = arr_y_pos[intposarr]
    for item in row:
        stritem = str(item)
        if stritem == "0":
        xpos += 27
        else :
        tagNumber = tuple((self.tagBaseNumber,stritem))
        self.canvas.create_text(xpos, ypos , text=stritem,
            font=fnta,tags=tagNumber)
            xpos += 27
    intposarr += 1
    self.canvas.tag_bind ("DayButton", "<ButtonRelease-1>", self.fnClickNumber)
    self.canvas.tag_bind ("DayButton", "<Enter>", self.fnOnMouseOver)
    self.canvas.tag_bind ("DayButton", "<Leave>", self.fnOnMouseOut)

  def fnClickNumber(self,event):
    owntags =self.canvas.gettags(CURRENT)
    for x in owntags:
    if (x == "current") or (x == "DayButton"): pass
    else :
        strdate = (str(self.year_var.get()) + "/" +
            str(self.intmonth) + "/" +
            str(x))
        self.update_var.set(strdate)
        self.top.withdraw()
  def fnOnMouseOver(self,event):
    self.canvas.move(CURRENT, 1, 1)
    self.canvas.update()

  def fnOnMouseOut(self,event):
    self.canvas.move(CURRENT, -1, -1)
    self.canvas.update()


if __name__ == "__main__":
    root = Tk()
    aplicacion = Planificador(root)
    root.mainloop()

The problem is that I'm not working with two StringVar and the desired solution needs one StringVar for each in-day and out-date so only one date changes and not all of them, but I'm having problems trying to handle this and I dont know how to do it, plus, theres a add more button, which adds a new date to the UI. The UI must mantain the two-column structure.

I've tryed to do make a list of StringVar and select one of this each iteration, but it's not working:

self.stringList = []                     
for i in xrange(int(self.date_num)*2):
    self.stringList.append(StringVar())
    self.stringList[i].set(" date ")

Are there any ways to fix this?

Upvotes: 1

Views: 1113

Answers (2)

martineau
martineau

Reputation: 123531

Below are changes to yourPlanificadorclass which I think make it function the way you want with independent dateStringVars. The ability to dynamically add dates with the add more button also works. You basically had the right idea about making list of StringVars. In addition to that it also puts the corresponding buttons in it to preserve them.

One thing I noticed with your code was that you didn't seem to understand that therowandcolumn keyword argument values passed to thegrid()method of a widget are relative to the widget's frame itself rather than to its parent's. That actually one of the useful things about usingFramesbecause it can greatly simplify laying out things.

screenshoot of working dialog


class Planificador(Frame):
    def __init__(self,master):
        Frame.__init__(self, master)
        self.master = master
        self.initUI()

    def initUI(self):
        self.master.title("Planner")
        self.frameOne = Frame(self.master)
        self.frameOne.grid(row=0,column=0)
        self.frameTwo = Frame(self.master)
        self.frameTwo.grid(row=0, column=1)
        self.frameThree = Frame(self.master)
        self.frameThree.grid(row=0, column=2)

        self.frameFour = Frame(self.master)
        self.frameFour.grid(row=1,column=0, sticky=N)
        self.frameFive = Frame(self.master)
        self.frameFive.grid(row=1, column=1)
        self.frameSix = Frame(self.master)
        self.frameSix.grid(row=1, column=2, sticky=N)

        self.frameSeven = Frame(self.master)
        self.frameSeven.grid(row=2,column=0)
        self.frameEight = Frame(self.master)
        self.frameEight.grid(row=2, column=1, sticky=S)
        self.frameNine = Frame(self.master)
        self.frameNine.grid(row=2, column=2)

        self.start_date_menu()

    def start_date_menu(self):
        initial_num_dates = int(raw_input("Number of dates?"))
#        initial_num_dates = 5
        self.DATE_MENU_ROW = 0  # initial date menu grid row
        self.COL_WIDTH = 10  # width of each subcolumn of dates

        for frame in (self.frameFour, self.frameSix):
            self.textoprioridad = Label(frame, text="Day in",
                                        width=self.COL_WIDTH, justify="center")
            self.textoprioridad.grid(row=self.DATE_MENU_ROW, column=0)
            self.lotestext = Label(frame, text="Day out", width=self.COL_WIDTH,
                                   justify="center")
            self.lotestext.grid(row=self.DATE_MENU_ROW, column=1)

        self.dates = [self.create_date_entry(date_index)
                        for date_index in xrange(initial_num_dates)]

        self.anadirpiezas = Button(self.frameEight, text="add more",
                                   command=self.addpieza, width=self.COL_WIDTH)
        self.anadirpiezas.grid(row=0, column=3)

    def addpieza(self):
        self.dates.append(self.create_date_entry(len(self.dates)))

    def create_date_entry(self, date_index):
        # create and return seq of two pairs of button, stringvar for a date
        menu_col = date_index % 2  # left/right column of the date frame
        menu_row = self.DATE_MENU_ROW + date_index/2 + 1
        frame = self.frameSix if menu_col else self.frameFour
        pairs = []
        for col in 0, 1:
            pairs.append(StringVar(value="--------"))
            pairs.append(Button(frame, textvariable=pairs[-1],
                                width=self.COL_WIDTH,
                                command=lambda v=pairs[-1]: self.fnCalendar(v)))
            pairs[-1].grid(row=menu_row, column=col)
        return tuple(pairs)

    def fnCalendar(self, datebar):
        tkCalendar(self.master, year, month, day, datebar)

I also changed thefnClickNumber()method ofclass tkCalendarso it would always return dates with 2 digit month and day values, but its use is optional.

    def fnClickNumber(self,event):
        owntags =self.canvas.gettags(CURRENT)
        for x in owntags:
            if (x == "current") or (x == "DayButton"): pass
            else:
                strdate = (str(self.year_var.get()) + "/" +
                           '%02d' % self.intmonth + "/" +
                           '%02d' % int(x))
                self.update_var.set(strdate)
                self.top.withdraw()

Upvotes: 2

furas
furas

Reputation: 143231

I make changes only in Planificador class.

I change some names to english

I don't use Windows so I turn off from win32com.client import Dispatch

In last moment I add "Remove last" button

# -*- coding: utf-8 -*-
import os
from Tkinter import *
import Image
import ImageTk
import tkFileDialog
import xlrd
import csv
from tkMessageBox import *
#from win32com.client import Dispatch
import datetime
import time
import calendar

#----------------------------------------------------------------------

year  = time.localtime()[0]
month = time.localtime()[1]
day   = time.localtime()[2]
#strdate = (str(year) +  "/" + str(month) + "/" + str(day))
strdate = "%d/%d/%d" % time.localtime()[0:3]

#----------------------------------------------------------------------

fnta = ("Helvetica", 10)
fnt  = ("Helvetica", 10)
fntc = ("Helvetica", 10, 'bold')

#----------------------------------------------------------------------

lang=""

if lang == "span":
    #Spanish Options
    strtitle   = "Calendario"
    strdays    = "Do  Lu  Ma  Mi  Ju  Vi  Sa"
    dictmonths = {
        '1':'Ene','2':'Feb','3':'Mar','4':'Abr','5':'May','6':'Jun',
        '7':'Jul','8':'Ago','9':'Sep','10':'Oct','11':'Nov','12':'Dic'
    }
else :
    #English Options
    strtitle   = "Calendar"
    strdays    = "Su  Mo  Tu  We  Th  Fr  Sa"
    dictmonths = {
        '1':'Jan','2':'Feb','3':'Mar','4':'Apr','5':'May','6':'Jun',
        '7':'Jul','8':'Aug','9':'Sep','10':'Oct','11':'Nov','12':'Dec'
    }

#----------------------------------------------------------------------

class Planificador(Frame):

    def __init__(self,master):
        Frame.__init__(self, master)        
        self.master = master
        self.initUI()

    def initUI(self):
        self.master.title("Planner")

        # subframe for all dates
        self.frame_with_dates = Frame(self.master)
        self.frame_with_dates.grid(row=0,column=0)

        # adding dates to subframe
        self.start_date_menu()

        # adding button "Add more" to main frame
        self.add_button = Button(self.master, text="Add more", command=self.add_more, width=10)
        self.add_button.grid(row=1,column=0, pady=(10,10))

        # adding button "Remove last" to main frame
        self.remove_button = Button(self.master, text="Remove last", command=self.remove_last, width=10)
        self.remove_button.grid(row=2,column=0, pady=(10,10))

    def start_date_menu(self):

        self.date_num = int(raw_input("Number of dates? ")) # get integer

        # left columns
        self.label_day_in_left = Label(self.frame_with_dates, text = "Day in", justify="center")
        self.label_day_in_left.grid(row=0,column=0,padx=(10,10))

        self.label_day_out_left = Label(self.frame_with_dates, text = "Day out", justify="center")
        self.label_day_out_left.grid(row=0,column=1,padx=(10,10))

        # space between columns
        self.label_empty = Label(self.frame_with_dates, text = "|", justify="center")
        self.label_empty.grid(row=0,column=2,padx=(25,25))

        # right columns
        self.label_day_in_right = Label(self.frame_with_dates, text = "Day in", justify="center")
        self.label_day_in_right.grid(row=0,column=3,padx=(10,10))

        self.label_day_out_right = Label(self.frame_with_dates, text = "Day out", justify="center")
        self.label_day_out_right.grid(row=0,column=4,padx=(10,10))

        # list of buttons and variables
        self.dates_buttons = []
        self.dates_vars = []

        # adding button and variable

        self.n = 0 # list starts at 0
        while self.n < self.date_num:

            # add n-th button and variable
            self.add_date_button(self.n)

            # next element  
            self.n += 1

    def add_more(self):
        self.add_date_button(self.date_num)
        self.date_num += 1

    def remove_last(self):
        if self.date_num > 0:
            self.date_num -= 1
            self.dates_buttons[-1][0].destroy()
            self.dates_buttons[-1][1].destroy()
            del self.dates_buttons[-1]
            del self.dates_vars[-1]

    def add_date_button(self, n):

        # default button value
        string_button_in = "day in" 
        string_button_out = "day out"

        # position 

        _row = 1 + n/2  

        if n % 2 == 0:
            _column = 0 # left column
        else:
            _column = 3 # right column

        # adding variable to list - dictionary(in, out)
        self.dates_vars.append({'in':StringVar(), 'out':StringVar()})

        # setting variable text
        self.dates_vars[n]['in'].set("%s (%d)" % (string_button_in, n)) # "day in (number)" 
        self.dates_vars[n]['out'].set("%s (%d)" % (string_button_out, n)) # "day out (number)" 

        # creating buttons
        newbutton_in = Button(self.frame_with_dates, textvariable=self.dates_vars[n]['in'], command=lambda _n=n:self.fnCalendar(self.dates_vars[_n]['in']))
        newbutton_in.grid(row=_row, column=_column, padx=(10,10))

        newbutton_out = Button(self.frame_with_dates, textvariable=self.dates_vars[n]['out'], command=lambda _n=n:self.fnCalendar(self.dates_vars[_n]['out']))
        newbutton_out.grid(row=_row, column=_column+1, padx=(10,10))

        # adding buttons to list
        #self.dates_buttons.append({'in':newbutton_in, 'out':newbutton_out}) # adding as dictionary
        self.dates_buttons.append((newbutton_in,newbutton_out)) # adding as tuple


    def fnCalendar(self, datebar):
        # open window with calendar
        tkCalendar(self.master, year, month, day, datebar)

#----------------------------------------------------------------------

class tkCalendar :

    def __init__(self, master, arg_year, arg_month, arg_day,
            arg_parent_updatable_var):

        self.update_var = arg_parent_updatable_var
        top = self.top = Toplevel(master)
        top.title("Eleccion de fecha")
        try : self.intmonth = int(arg_month)
        except: self.intmonth = int(1)
        self.canvas = Canvas (top, width =200, height =220,
          relief =RIDGE, background ="#ece9d8", borderwidth =0)
        self.canvas.create_rectangle(0,0,303,30, fill="#ece9d8",width=0 )
        self.canvas.create_text(100,17, text="Elige una fecha",  font=fntc, fill="#BA1111")
        stryear = str(arg_year)

        self.year_var=StringVar()
        self.year_var.set(stryear)
        self.lblYear = Label(top, textvariable = self.year_var,
            font = fnta, background="#ece9d8")
        self.lblYear.place(x=85, y = 30)

        self.month_var=StringVar()
        strnummonth = str(self.intmonth)
        strmonth = dictmonths[strnummonth]
        self.month_var.set(strmonth)

        self.lblYear = Label(top, textvariable = self.month_var,
            font = fnta, background="#ece9d8")
        self.lblYear.place(x=85, y = 50)
        #Variable muy usada
        tagBaseButton = "Arrow"
        self.tagBaseNumber = "DayButton"
        #draw year arrows
        x,y = 40, 43
        tagThisButton = "leftyear"
        tagFinalThisButton = tuple((tagBaseButton,tagThisButton))
        self.fnCreateLeftArrow(self.canvas, x,y, tagFinalThisButton)
        x,y = 150, 43
        tagThisButton = "rightyear"
        tagFinalThisButton = tuple((tagBaseButton,tagThisButton))
        self.fnCreateRightArrow(self.canvas, x,y, tagFinalThisButton)
        #draw month arrows
        x,y = 40, 63
        tagThisButton = "leftmonth"
        tagFinalThisButton = tuple((tagBaseButton,tagThisButton))
        self.fnCreateLeftArrow(self.canvas, x,y, tagFinalThisButton)
        x,y = 150, 63
        tagThisButton = "rightmonth"
        tagFinalThisButton = tuple((tagBaseButton,tagThisButton))
        self.fnCreateRightArrow(self.canvas, x,y, tagFinalThisButton)
        #Print days
        self.canvas.create_text(100,90, text=strdays, font=fnta)
        self.canvas.pack (expand =1, fill =BOTH)
        self.canvas.tag_bind ("Arrow", "<ButtonRelease-1>", self.fnClick)
        self.canvas.tag_bind ("Arrow", "<Enter>", self.fnOnMouseOver)
        self.canvas.tag_bind ("Arrow", "<Leave>", self.fnOnMouseOut)
        self.fnFillCalendar()

    def fnCreateRightArrow(self, canv, x, y, strtagname):
        canv.create_polygon(x,y, [[x+0,y-5], [x+10, y-5] , [x+10,y-10] ,
            [x+20,y+0], [x+10,y+10] , [x+10,y+5] , [x+0,y+5]],
            tags = strtagname , fill="black", width=0)

    def fnCreateLeftArrow(self, canv, x, y, strtagname):
        canv.create_polygon(x,y, [[x+10,y-10], [x+10, y-5] , [x+20,y-5] ,
            [x+20,y+5], [x+10,y+5] , [x+10,y+10] ],
            tags = strtagname , fill="black", width=0)


    def fnClick(self,event):
        owntags =self.canvas.gettags(CURRENT)
        if "rightyear" in owntags:
            intyear = int(self.year_var.get())
            intyear +=1
            stryear = str(intyear)
            self.year_var.set(stryear)
        if "leftyear" in owntags:
            intyear = int(self.year_var.get())
            intyear -=1
            stryear = str(intyear)
            self.year_var.set(stryear)
        if "rightmonth" in owntags:
            if self.intmonth < 12 :
                self.intmonth += 1
                strnummonth = str(self.intmonth)
                strmonth = dictmonths[strnummonth]
                self.month_var.set(strmonth)
            else :
                self.intmonth = 1
                strnummonth = str(self.intmonth)
                strmonth = dictmonths[strnummonth]
                self.month_var.set(strmonth)
                intyear = int(self.year_var.get())
                intyear +=1
                stryear = str(intyear)
                self.year_var.set(stryear)
        if "leftmonth" in owntags:
            if self.intmonth > 1 :
                self.intmonth -= 1
                strnummonth = str(self.intmonth)
                strmonth = dictmonths[strnummonth]
                self.month_var.set(strmonth)
            else :
                self.intmonth = 12
                strnummonth = str(self.intmonth)
                strmonth = dictmonths[strnummonth]
                self.month_var.set(strmonth)
                intyear = int(self.year_var.get())
                intyear -=1
                stryear = str(intyear)
                self.year_var.set(stryear)
        self.fnFillCalendar()

    def fnFillCalendar(self):
        init_x_pos = 20
        arr_y_pos = [110,130,150,170,190,210]
        intposarr = 0
        self.canvas.delete("DayButton")
        self.canvas.update()
        intyear = int(self.year_var.get())
        monthcal = calendar.monthcalendar(intyear, self.intmonth)
        for row in monthcal:
            xpos = init_x_pos
            ypos = arr_y_pos[intposarr]
            for item in row:
                stritem = str(item)
                if stritem == "0":
                    xpos += 27
                else :
                    tagNumber = tuple((self.tagBaseNumber,stritem))
                    self.canvas.create_text(xpos, ypos , text=stritem,
                    font=fnta,tags=tagNumber)
                    xpos += 27
        intposarr += 1
        self.canvas.tag_bind ("DayButton", "<ButtonRelease-1>", self.fnClickNumber)
        self.canvas.tag_bind ("DayButton", "<Enter>", self.fnOnMouseOver)
        self.canvas.tag_bind ("DayButton", "<Leave>", self.fnOnMouseOut)

    def fnClickNumber(self,event):
        owntags = self.canvas.gettags(CURRENT)
        for x in owntags:
            if (x == "current") or (x == "DayButton"): pass
            else :
                strdate = (str(self.year_var.get()) + "/" +
                    str(self.intmonth) + "/" +
                    str(x))
                self.update_var.set(strdate)
                self.top.withdraw()

    def fnOnMouseOver(self,event):
        self.canvas.move(CURRENT, 1, 1)
        self.canvas.update()

    def fnOnMouseOut(self,event):
        self.canvas.move(CURRENT, -1, -1)
        self.canvas.update()

#----------------------------------------------------------------------

if __name__ == "__main__":
    root = Tk()
    aplicacion = Planificador(root)
    root.mainloop()

Upvotes: 1

Related Questions