0

我不完全确定如何用一句话来表达我的问题。我正在使用 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=???)

我省略了很多代码。显示的是每天放置按钮的代码,以及在日历上放置步伐的代码。我尝试了一些东西放在行和列中。我通常会收到错误消息,或者它在每个框中都放置了相同的标签。我需要知道如何更改按钮或在行和列中放置什么以仅替换单击的按钮。如果需要其他任何东西,我会非常频繁地检查并经常更新。

4

2 回答 2

0

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

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)
于 2016-04-28T03:55:15.430 回答
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
于 2016-04-28T01:26:59.190 回答