基本上,我正在尝试实现一个功能,如果用户在组合框中输入的内容超过八个字符,它会自动创建一个新的组合框。我已经有一个可以创建新组合框的按钮,我只需要找到一种在用户输入超过八位数字时自动调用该函数的方法。
这是我到目前为止的代码:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.resizable(True, True)
frame = tk.Frame(root)
frame.grid(sticky='nsew')
root.anchor("center")
#These are the buttons used for
dropdown_barcode = []
quant_dropdown = []
delete_btn = []
canvas = tk.Canvas(frame)
canvas.grid(row=2, column=0, pady=(5, 0), sticky='nsew')
scrollbar = tk.Scrollbar(frame, orient="vertical", command=canvas.yview)
scrollbar.grid(row=2, column=1, pady=(5, 0), sticky='ns')
canvas.configure(yscrollcommand=scrollbar.set)
canvas.bind('<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox("all")))
text_frame = tk.Frame(canvas)
canvas.create_window((0, 0), window=text_frame, anchor="nw")
def update_widgets():
for id3, btn_widget in enumerate(delete_btn):
btn_widget.grid(row=id3, column=0, pady=6, padx= (20,5))
for idx, txt_widget in enumerate(dropdown_barcode):
txt_widget.grid(row=idx, column=1, pady=6, padx=(5,5))
for id2, quant_widget in enumerate(quant_dropdown):
quant_widget.grid(row=id2, column=2, pady=6, padx=(5,0))
canvas.configure(scrollregion=canvas.bbox("all"))
def new_item():
new_bardcode = ttk.Combobox(text_frame, height=1, width=30, font=("Helvetica", 10))
dropdown_barcode.append(new_bardcode)
new_quant = ttk.Combobox(text_frame, height=1, width=5, font=("Helvetica", 10))
quant_dropdown.append(new_quant)
# Get the index of the current row
current_index = len(dropdown_barcode) - 1
delete_btn1 = tk.Button(text_frame, text="-", width= 3, command=lambda idx=current_index: remove_item(idx))
delete_btn.append(delete_btn1)
update_widgets()
def remove_item(index):
# Destroy widgets related to the index
dropdown_barcode[index].destroy()
quant_dropdown[index].destroy()
delete_btn[index].destroy()
# Remove them from the lists
del dropdown_barcode[index]
del quant_dropdown[index]
del delete_btn[index]
update_widgets()
send_item = tk.Button(frame, text="->")
add_txtbox = tk.Button(frame, text="+", command=new_item)
remove_text_btn = tk.Button(frame, text="-", command=remove_item)
employee_id= ttk.Combobox(frame, height=1, width=30, font=("Helvetica", 10))
add_txtbox.grid(row=3, column=0, padx=(0, 250), pady=10)
send_item.grid(row=3, column=0, pady=6, padx=(280, 0))
employee_id.grid(row=3, column=0, padx=(15,0))
new_item() # Add the initial text widget
root.mainloop()
澄清我的评论。每当用户输入
validatecommand
时,您可以使用 key
选项来挂钩回调函数。您不需要指定该密钥。您可以使用替换代码进一步指定应传递给挂钩函数的值。
使用代码实现此目的的简单方法:
修改函数 new_item() 使得:
new_bardcode = ttk.Combobox(text_frame, height=1, width=30, font=("Helvetica", 10), validate='key', validatecommand=(root.register(onValidateComboBoxEntry), '%P'))
以及匹配的回调函数:
def on_validate_combobox_entry(text):
if (len(text) > 8):
new_item()
return True
每当第一个组合框(以及进一步添加的组合框)中提供的字符超过 8 个时,这将简单地创建一个新的组合框。因此,如果您不想输入更多内容,则必须以某种方式冻结现有内容。 我希望这符合您要求的方向。