1

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?

4

2 回答 2

2

以下是对您的Planificador课程的更改,我认为这些更改使其按照您想要的方式与独立StringVar的 date 一起运行。使用按钮动态添加日期的功能add more也有效。您基本上对制作StringVars 列表有正确的想法。除此之外,它还将相应的按钮放入其中以保留它们。

我在您的代码中注意到的一件事是,您似乎不明白传递给小部件方法的rowcolumn关键字参数值grid()是相对于小部件的框架本身而不是其父框架的。这实际上是使用的有用的东西之一,Frames因为它可以大大简化布局。

工作对话框截图


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)

我还更改了fnClickNumber()方法,class tkCalendar因此它总是返回具有 2 位数月份和日期值的日期,但它的使用是可选的。

    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()
于 2013-11-04T22:18:58.873 回答
1

我只在 Planificador 类中进行更改。

我把一些名字改成英文

我不使用 Windows,所以我关闭from win32com.client import Dispatch

在最后一刻,我添加了“删除最后一个”按钮

# -*- 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()
于 2013-11-04T20:14:36.183 回答