在GUI的另一个区域填充条目小部件后如何显示某些内容?



我正在构建一个GUI来编写excel电子表格。然而,在我编写电子表格之前,用户将在GUI中输入数据。我想做的是,当用户在第一个条目和标签中输入版本号时;对于下一个条目,我希望日期自动填充。

import tkinter
from tkinter import ttk
from tkinter import messagebox
import os
import openpyxl
from datetime import datetime

window = tkinter.Tk()
window.title("Truck Log Entry Form")
frame = tkinter.Frame(window)
frame.pack()
#saving truck logs
truck_info_frame = tkinter.LabelFrame(frame, text="Truck Information")
truck_info_frame.grid(row= 0, column=0, padx=20, pady=10)
release_number_label = tkinter.Label(truck_info_frame, text="Release Number")
release_number_label.grid(row=0,column=0)
truck_name_label = tkinter.Label(truck_info_frame, text="Truck Name")
truck_name_label.grid(row=0, column=1)
tare_info_label = tkinter.Label(truck_info_frame, text="Tare Weight")
tare_info_label.grid(row=0, column=2)
date_info_label = tkinter.Label(truck_info_frame, text="Date/Time")
date_info_label.grid(row=0, column=3)
gross_info_label = tkinter.Label(truck_info_frame, text = "Gross Weight")
gross_info_label.grid(row=0, column=4)

date_info_result_str = tkinter.StringVar()
release_number_entry = tkinter.Entry(truck_info_frame, textvariable=date_info_result_str)
truck_name_entry = tkinter.Entry(truck_info_frame)
tare_info_entry = tkinter.Entry(truck_info_frame)
#date_info_result = tkinter.Label(truck_info_frame, text='')
date_info_result = tkinter.Label(truck_info_frame)
date_info_result.grid(row=1, column=3)
date_info_result_str.trace('w', lambda *args: auto_date(release_number_entry.get()) )
release_number_entry.grid(row=1, column=0)
truck_name_entry.grid(row=1, column=1)
tare_info_entry.grid(row=1, column=2)

for widget in truck_info_frame.winfo_children():
widget.grid_configure(padx=10, pady=5)
def auto_date(release_filled):
print("in auto_date function " + release_filled)
#release_filled = release_number_entry.get()
if len(release_filled) >= 6:
print("in len area")
#datetime object containing current date and time
now = datetime.now()
#format date and time to dd/mm/YY H:M:S
dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
return dt_string
else:
print("made in error")
#tkinter.messagebox.showwarning(title="Error", message="Please check release number")
window.mainloop()

我创建了一个函数来调用它,然后尝试做一个。trace方法,但这似乎不起作用。此外,我尝试混淆验证,但它只返回真或假,我不知道如何得到,我想调用另一个函数来显示data_info_label下的时间。如果你能帮助我,我将不胜感激。

更新(1/12/23):我能够调用函数并使其成功跟踪,但是我如何将日期和时间从函数返回到标签中?

我想做的是当用户在第一个条目和"标签"对于下一个条目,我希望日期自动填充。

如果您想在用户按tab键时做一些事情,您可以将一个函数绑定到事件<Tab>。您不希望在与stringvar相关的跟踪中执行此操作,因为每次用户插入或删除单个字符时都会调用该操作。

下面是一个非常简单的例子,展示了一种方法:

import tkinter as tk
from datetime import datetime
def insert_date(entry):
now = datetime.now()
label.configure(text=now.strftime("%c"))
root = tk.Tk()
entry = tk.Entry(root)
label = tk.Label(root)
entry.pack(side="top")
label.pack(side="top")
entry.bind("<Tab>", lambda event: insert_date(label))
root.mainloop()

当您运行上面的示例并在第一个条目具有键盘焦点时按tab键时,它将在第二个条目中插入日期和时间。

感谢@Brian Oakley,我能够弄清楚剩下的!巨大的帮助,下面是我如何做到的代码。

import tkinter
from tkinter import ttk
from tkinter import messagebox
import os
import openpyxl
from datetime import datetime

window = tkinter.Tk()
window.title("Truck Log Entry Form")
frame = tkinter.Frame(window)
frame.pack()
#saving truck logs
truck_info_frame = tkinter.LabelFrame(frame, text="Truck Information")
truck_info_frame.grid(row= 0, column=0, padx=20, pady=10)
release_number_label = tkinter.Label(truck_info_frame, text="Release Number")
release_number_label.grid(row=0,column=0)
truck_name_label = tkinter.Label(truck_info_frame, text="Truck Name")
truck_name_label.grid(row=0, column=1)
tare_info_label = tkinter.Label(truck_info_frame, text="Tare Weight")
tare_info_label.grid(row=0, column=2)
date_info_label = tkinter.Label(truck_info_frame, text="Date/Time")
date_info_label.grid(row=0, column=3)
gross_info_label = tkinter.Label(truck_info_frame, text = "Gross Weight")
gross_info_label.grid(row=0, column=4)

#date_info_result_str = tkinter.StringVar()
#release_number_entry = tkinter.Entry(truck_info_frame, textvariable=date_info_result_str)
release_number_entry = tkinter.Entry(truck_info_frame)
truck_name_entry = tkinter.Entry(truck_info_frame)
tare_info_entry = tkinter.Entry(truck_info_frame)
#date_info_result = tkinter.Label(truck_info_frame, text='')
date_info_result = tkinter.Label(truck_info_frame)
date_info_result.grid(row=1, column=3)
#date_info_result_str.trace('w', lambda *args: auto_date(release_number_entry.get()) )
release_number_entry.grid(row=1, column=0)
truck_name_entry.grid(row=1, column=1)
tare_info_entry.grid(row=1, column=2)
release_number_entry.bind("<Tab>", lambda event: auto_date(release_number_entry.get()))

for widget in truck_info_frame.winfo_children():
widget.grid_configure(padx=10, pady=5)
def auto_date(release_filled):
print("in auto_date function " + release_filled)
#release_filled = release_number_entry.get()
if len(release_filled) >= 6:
print("in len area")
#datetime object containing current date and time
now = datetime.now()
#format date and time to dd/mm/YY H:M:S
dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
date_info_result.config(text = dt_string)
else:
print("made in error")
#tkinter.messagebox.showwarning(title="Error", message="Please check release number")
window.mainloop()

最新更新