【问题标题】:How to display something after an Entry widget is filled in another area of the GUI?如何在 GUI 的另一个区域填充 Entry 小部件后显示内容?
【发布时间】:2023-01-13 00:51:41
【问题描述】:

我正在构建一个 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 方法,但这似乎不起作用。此外,我尝试搞乱验证,但它只返回 true 或 false,我不确定如何得到它,我想调用另一个函数来显示 data_info_label 下的时间。我将不胜感激任何帮助。

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

【问题讨论】:

  • .trace('1', auto_date(...) ) 有两个问题。首先.trace的第一个参数应该是"w"。其次,它应该是lambda: auto_date(...) 而不仅仅是auto_date(...) - 查看here 了解更多信息。
  • 所以我将其修改为您建议的内容,但现在它甚至不再调用该函数,我查看了您给我的链接。这是一个按钮,我不希望按钮作为因果关系,而是当我跳出输入框转到下一个输入框时。然而,这是一个好的开始,但出于某种原因,在我退出后它没有调用该功能。
  • 我链接的问题有同样的问题,当tkinter 需要一个函数时,你不能预先调用该函数。在这两种情况下,您都需要 lambda: auto_date(...) 而不是 auto_date(...)。另外 date_info_result_str 没有链接到任何东西。请看一些tkinter教程。
  • 我不想事先打电话给它。我试图在填写“发布编号”框后调用它,以便我可以自动填充日期/时间标签。

标签: python validation tkinter widget


【解决方案1】:

我想要做的是,当用户在第一个条目中输入版本号并在下一个条目中输入“制表符”时,我希望自动填充日期。

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

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

import tkinter as tk
from datetime import datetime

def insert_date(entry):
    now = datetime.now()
    entry.delete(0, "end")
    entry.insert(0, now.strftime("%c"))

root = tk.Tk()

entry1 = tk.Entry(root)
entry2 = tk.Entry(root)
entry1.pack(side="top")
entry2.pack(side="top")

entry1.bind("<Tab>", lambda event: insert_date(entry2))

root.mainloop()

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2012-04-06
    • 2016-12-28
    • 1970-01-01
    相关资源
    最近更新 更多