【问题标题】:Tkinter button gets variable not found errorTkinter 按钮获取变量未找到错误
【发布时间】:2020-04-21 07:24:52
【问题描述】:

我正在尝试使用 tkinter 创建一个程序,该程序允许员工单击“打卡”按钮,该按钮获取当前时间并创建一个新按钮“打卡”,单击“打卡”按钮后,该按钮将再次获取当前时间然后按每个按钮单击的时间增量显示总小时数。我的问题是由于未定义“ClockedIn”变量,程序没有返回总工作时间。我相信这是代码安排的问题,但我被卡住了。有谁知道如何解决这一问题?我是初学者编码器,并感谢任何反馈。谢谢。

我的代码如下:

from tkinter import *
import tkinter as tk
from tkinter import ttk
import time
import datetime
window = Tk()


def onclick1():
    label = tk.Label(text ="Clocked In")
    label.grid(row = 1, column = 3)
    label2 = tk.Label(text = time.strftime("%I:%M"))
    label2.grid(row =1, column = 5)
    CLockedIn = time.time()
    button2 = ttk.Button(window, text ="Clock Out")
    button2.grid(row = 2, column = 1)
    button2.config(command = onclick2)

def onclick2():
        label4 = tk.Label(text ="Clocked Out")
        label4.grid(row = 2, column = 3)
        ClockOut = time.time()
        label5 = tk.Label(text = time.strftime("%I:%M"))
        label5.grid(row =2, column = 5)
        Hours = int(ClockOut-CLockedIn)
        HoursLabel= tk.Label(Hours)
        HoursLabel.grid(row = 3, column = 4)

btn1 = ttk.Button(window, text = "Clock In")
btn1.grid(row=1,column=1)
btn1.config(command= onclick1)



window.mainloop()

【问题讨论】:

  • 您可以将ClockedIn 传递给onclick2() 函数,因此不需要全局变量。最好使用datetime.now() 而不是time.time()。那么ClockOut - ClockedIn 将是一个timedelta 实例,它可以以h:mm:ss 格式显示时差。

标签: python loops datetime tkinter


【解决方案1】:

正如错误所说,您需要添加一个全局变量CLockedIn。对变量使用大写字母不是一个好习惯。当您添加时差时,它将显示seconds 而不是hours 中的差异。

from tkinter import *
import tkinter as tk
from tkinter import ttk
import time
import datetime
window = Tk()

clocked_in = 0
def onclick1():
    global clocked_in
    label = tk.Label(text ="Clocked In")
    label.grid(row = 1, column = 3)
    label2 = tk.Label(text = time.strftime("%I:%M"))
    label2.grid(row =1, column = 5)
    clocked_in = time.time()
    button2 = ttk.Button(window, text ="Clock Out")
    button2.grid(row = 2, column = 1)
    button2.config(command = onclick2)

def onclick2():
        label4 = tk.Label(text ="Clocked Out")
        label4.grid(row = 2, column = 3)
        clocked_out = time.time()
        label5 = tk.Label(text = time.strftime("%I:%M"))
        label5.grid(row =2, column = 5)
        hours = int(clocked_out-clocked_in)
        hoursLabel= tk.Label(text=hours)
        hoursLabel.grid(row = 3, column = 4)

btn1 = ttk.Button(window, text = "Clock In")
btn1.grid(row=1,column=1)
btn1.config(command= onclick1)

window.mainloop()

【讨论】:

    【解决方案2】:

    Prudhvi 已经explained in their answer 认为您的主要问题的根本原因是CLockedIn 是一个局部变量,在退出函数作用域后会被销毁。他们还暗示减去两个time.time 对象将导致秒而不是小时。以下是一些关于如何清理按钮标签中的演示的建议:

    from tkinter import *
    import tkinter as tk
    from tkinter import ttk
    import time
    
    
    def onclick1():
        global CLockedIn
        CLockedIn = time.time()
        label = tk.Label(text="Clocked In")
        label.grid(row=1, column=3)
        label2 = tk.Label(text=time.strftime('%Y-%m-%d %H:%M %Z', time.localtime(CLockedIn)))
        label2.grid(row=1, column=5)
        button2 = ttk.Button(window, text="Clock Out")
        button2.grid(row=2, column=1)
        button2.config(command=onclick2)
    
    
    def onclick2():
        global ClockOut
        ClockOut = time.time()
        label4 = tk.Label(text="Clocked Out")
        label4.grid(row=2, column=3)
        label5 = tk.Label(text=time.strftime('%Y-%m-%d %H:%M %Z', time.localtime(ClockOut)))
        label5.grid(row=2, column=5)
        Hours = (ClockOut - CLockedIn)
        HoursLabel = tk.Label(text=f"{int(Hours//3600)} hrs {int((Hours%3600)//60)} mins {round((Hours%3600)%60,2)} secs")
        HoursLabel.grid(row=3, column=4)
    
    
    window = Tk()
    
    ClockOut, CLockedIn = None, None
    btn1 = ttk.Button(window, text="Clock In")
    btn1.grid(row=1, column=1)
    btn1.config(command=onclick1)
    
    window.mainloop()
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多