enter image description here

我正在用Tkinter编写一个简单的计时器.我想让我的代码保存在Excel文件中激活停止按钮时计时器显示的时间.计时器工作正常,但数据只存储在Excel文件的一行中.当一行中有5个单元格被填满时,我希望它改变行.

我一直在try 使用条件for循环.例如,每次单元格值为not None时,我试图用1增加min_row,但它不起作用.

有人能告诉我我做错了什么吗?

# ***** IMPORTS *****
import tkinter as tk
from openpyxl import Workbook
from openpyxl import load_workbook



running = False
# time variables initially set to 0
hours, minutes, seconds, total_time = 0, 0, 0, 0

def start():
    global running
    if not running:
        update()
        running = True

# pause function
def pause():
    global running
    if running:
        # cancel updating of time using after_cancel()
        stopwatch_label.after_cancel(update_time)
        running = False

# reset function
def reset():
    global running
    if running:
        # cancel updating of time using after_cancel()
        stopwatch_label.after_cancel(update_time)
        running = False
    # set variables back to zero
    global hours, minutes, seconds
    hours, minutes, seconds = 0, 0, 0
    # set label back to zero
    stopwatch_label.config(text='00:00:00')

# update stopwatch function
def update():
    # update seconds with (addition) compound assignment operator
    global hours, minutes, seconds, total_time
    seconds += 1
    total_time += 1
    if seconds == 60:
        minutes += 1
        seconds = 0
    if minutes == 60:
        hours += 1
        minutes = 0
    # format time to include leading zeros
    hours_string = f'{hours}' if hours > 9 else f'0{hours}'
    minutes_string = f'{minutes}' if minutes > 9 else f'0{minutes}'
    seconds_string = f'{seconds}' if seconds > 9 else f'0{seconds}'
    # update timer label after 1000 ms (1 second)
    stopwatch_label.config(text=hours_string + ':' + minutes_string + ':' + seconds_string)

    global update_time
    update_time = stopwatch_label.after(1000, update)
    
def excel_update():
    dest_filename = r"C:\Users\abbas\OneDrive\Desktop\Prog\Flex\tider.xlsx"
    #dest_filename = r"C:\Users\abbas\OneDrive\Desktop\Prog\Flex\test.xlsx"
    wb = load_workbook(dest_filename)
    ws = wb.active
    next_row = 1
    
    cell_range = ws.iter_rows(min_row=next_row, max_row=3, max_col=2)
    #cell_range = ws["A1":"B3"]
    
    for rows in cell_range:        
        for columns in rows:
            if columns.value[columns] is None:
                columns.value[columns] = total_time
                          
        break
    
    wb.save(dest_filename)   
    
# ***** WIDGETS *****
# create main window
root = tk.Tk()
#root.geometry('450x200')
root.resizable(width=False, height=False)
root.title('Stopwatch')

# label to display time
stopwatch_label = tk.Label(text='00:00:00', font=('Arial', 20))
stopwatch_label.pack()

# start, pause, reset, stop buttons
start_button = tk.Button(text='start', height=3, width=5, font=('Arial', 10), command=start)
start_button.pack(side=tk.LEFT)

stop_button = tk.Button(text='stop', height=3, width=5, font=('Arial', 10), command=lambda:[root.quit(), excel_update()])
stop_button.pack(side=tk.LEFT)

pause_button = tk.Button(text='pause', height=3, width=5, font=('Arial', 10), command=pause)
pause_button.pack(side=tk.LEFT)

reset_button = tk.Button(text='reset', height=3, width=5, font=('Arial', 10), command=reset)
reset_button.pack(side=tk.LEFT)

# ***** MAINLOOP *****
root.mainloop()

推荐答案

根据您更新的问题中的代码,我认为如下所示更改excel_update()函数将使其满足您的要求.

它在从min_rowmax_row的行的列中搜索,寻找一个空的cell.如果它找到了一个循环,它将为其分配时间值,并引发StopIteration异常,以跳出嵌套的for个循环并终止搜索.然后,由于异常是正常处理的一部分,因此将忽略它.

from tkinter.messagebox import showerror

def excel_update():
def excel_update():
    dest_filename = r"C:\Users\abbas\OneDrive\Desktop\Prog\Flex\tider.xlsx"
    wb = load_workbook(dest_filename)
    ws = wb.active

    # Put value in next empty cell in specified region (if one exists).
    try:
        for row in ws.iter_rows(min_row=1, max_row=3, max_col=3):
            for cell in row:
                if cell.value is None:
                    cell.value = total_time
                    raise StopIteration
        else:  # No exception raised.
            showerror('Error!', 'No empty cells left for storing timer time!')
    except StopIteration:
        pass

    wb.save(dest_filename)  # Update file.

Python相关问答推荐

脚注在Python中使用regex导致错误匹配

使用Python进行网页抓取,没有页面

键盘.任务组

收件箱转换错误- polars.exceptions. ComputeHelp- pandera(0.19.0b3)带有polars

当值是一个integer时,在Python中使用JMESPath来验证字典中的值(例如:1)

使文本输入中的文本与标签中的文本相同

如何防止Plotly在输出到PDF时减少行中的点数?

在Python中为变量的缺失值创建虚拟值

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

为什么默认情况下所有Python类都是可调用的?

Python,Fitting into a System of Equations

如何使用scipy的curve_fit与约束,其中拟合的曲线总是在观测值之下?

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

字符串合并语法在哪里记录

Pandas GroupBy可以分成两个盒子吗?

名为__main__. py的Python模块在导入时不运行'

重置PD帧中的值

Pandas:填充行并删除重复项,但保留不同的值

polars:有效的方法来应用函数过滤列的字符串

查看pandas字符列是否在字符串列中