将相同的按钮放在多个位置,但具有独特的功能

时间:2016-04-27 23:49:39

标签: python user-interface lambda tkinter functools

我不完全确定如何用一句话来表达我的问题。我正在使用python创建一个能够记录运动员里程数的日历。我制作了一个日历,其中包含一个7x4网格,其中包含左上角的月份编号,以及中心的一个按钮,显示“记录今天的锻炼。”

该按钮应该打开一个新窗口,允许用户输入行驶里程和速度,当用户按下新窗口底部的“日志”时,它应显示里程和步伐。按下按钮的那一天。

我的问题,我无法弄清楚如何仅替换点击信息的特定日期。因为我不想为每个月的每一天制作一个按钮,所以每天都有相同的按钮(以及相同的命令)。我需要按钮知道它在网格中的位置,并能够告诉标签在哪里放置里程和步伐。

我曾尝试研究lambda以确定它是否会有所帮助,但无济于事。这里是我的代码的相关部分(仍然是相当新的python,可能有点草率,我道歉)。

 count = 0      #Code for button on every day in the month
    dayCounter = numDays[0]
    rowCount = 3
    while (numDays[1] > count):
        count = count + 1
        logButton = Button(self, text=("Log Today's Workout"), command = self.log)
        logButton.grid(column=dayCounter, row=rowCount)
        if dayCounter == 6:
            rowCount = rowCount + 1   
        if dayCounter <= 5:
            dayCounter = dayCounter + 1
        else:
            dayCounter = 0



def calculate(self): 
    displayPace = Label(self, text= paceMin + ":" + formattedSec + " a mile.")
    displayPace.grid(column=???, row=???)

我省略了很多代码。显示的是每天放置按钮的代码,以及在日历上放置节奏的代码。我尝试过在行和列中放置一些东西。我主要收到错误消息,或者在每个方框中放置相同的标签。我需要知道如何更改按钮或放入行和列的内容以仅替换单击的按钮。如果还需要其他任何东西,我会经常检查这个并经常更新。

2 个答案:

答案 0 :(得分:0)

提供的代码很少,很难为您提供有效的解决方案;这是我要采取的方法:

def log(self, event):
    x, y = event.x, event.y
    date_ = self._get_date_from_canvas_location(x, y)
    self.log_a_run(date_)

def _get_date_from_canvas_location(self, x, y):
    """returns the date corresponding to the canvas location clicked
    """
    # do the job
    return date_corresponding_to_that_location

def log_a_run(self, date_):
    """capture and save the run of of the date_
    """
    # do the job

答案 1 :(得分:0)

使用上面的帖子和this one以及一些关于事件如何运作的研究(我从未听说过它们),我提出了这个:

grid_info = event.widget.grid_info()
self.displayRow = grid_info["row"]
self.displayColumn = grid_info["column"]

logButton = Button(self, text=("Log Today's Workout"))
logButton.grid(column=dayCounter, row=rowCount
logButton.bind('<Button-1>', self.log)

displayPace = Label(self, text= paceMin + ":" + formattedSec + " a mile.")
displayPace.grid(column=self.displayColumn, row=self.displayRow)