Кнопка Tkinter получает переменную not found - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь создать программу с 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()

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Prudhvi уже объяснил в своем ответе , что причина root вашей основной проблемы заключается в том, что 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()

0 голосов
/ 21 апреля 2020

Как говорит ошибка, вам нужно добавить глобальную переменную 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...