gpt4 book ai didi

python - 当我们在 tkinter 的 Text 小部件中清除它时,如何从列表中删除一个值?

转载 作者:行者123 更新时间:2023-11-30 22:29:54 27 4
gpt4 key购买 nike

我使用“for”循环创建了三行包含四列的文本小部件,如下所示。
enter image description here

我的目标是将每个文本小部件的列值附加到不同的列表中,例如 list1 =[] , list2=[] , list3=[]list4=[]因此,将函数与 tab 键绑定(bind)并使用 lambda我已将该值附加到其特定列表中。到目前为止效果很好。
enter image description here

enter image description here

现在的问题是,如果我错误地输入了错误的值(例如第二行第二列中的值 - 764),它也会被添加到列表中,因为绑定(bind)了“tab”。由于我为某些计算目的创建这些列表肯定会破坏我的计算。我们不能指望用户正确输入。
我想要一种方法来清除文本以及更改其在之前存储的列表中的值。只需在文本小部件中更改它就必须在列表中进行更改。

我的代码:

from tkinter import *

list1 = []
list2 = []
list3 = []
list4 = []

def testfunction(var):
print(var)
list1.append(var)

def testfunction2(var):
print(var)
list2.append(var)

def testfunction3(var):
print(var)
list3.append(var)

def testfunction4(var):
print(var)
list4.append(var)


root = Tk()

for _ in range(3):
t = StringVar()
t1 = IntVar()
t2 = IntVar()
t3 = IntVar()

ent = Entry(root, textvariable=t)
ent.bind("<Tab>",(lambda event, ent=ent:testfunction(ent.get())))
ent.grid(row=_, column=0)

ent2 = Entry(root, textvariable=t1)
ent2.bind("<Tab>",(lambda event, ent2=ent2:testfunction2(ent2.get())))
ent2.grid(row=_, column=1)

Rat = Entry(root, textvariable=t2)
Rat.bind("<Tab>",(lambda event, Rat=Rat:testfunction3(Rat.get())))
Rat.grid(row=_, column=2)

amt = Entry(root, textvariable=t3)
amt.bind("<Tab>",(lambda event, amt=amt:testfunction4(amt.get())))
amt.grid(row=_, column=3)


root.mainloop()

最佳答案

我建议你使用tkinter.Entry小部件而不是 tkinter.Text .
这些支持 textvariable可选参数,它可以接收一个变量,然后可以跟踪。

该变量是 tkinter.Variable 的一个实例类(class)。
更准确地说,它将是 tk.StringVar 之一类,扩展了前者。
它将为我们提供输入内容的句柄:它将始终自动更新,以保存当前输入的值。

所以我开始了:首先,我创建一个变量矩阵和一个条目矩阵。
为了简单明了,我选择向您展示一个详细而明确的版本,而不是嵌套列表推导式。

import tkinter as tk

root = tk.Tk()

variables = []
for i in range(3):
row = []
for j in range(4):
variable = tk.StringVar()
row.append(variable)
variables.append(row)

entries = []
for i in range(3):
row = []
for j in range(4):
entry = tk.Entry(root, textvariable=variables[i][j])
entry.grid(row=i, column=j)
row.append(entry)
entries.append(row)

此时,我们可以调用 root.mainloop() ,并观察与您生成的条目相同的网格。

现在,让我们定义一个 get_values功能:它将帮助我们获取条目的输入。 tkinter.Variable 的值可以通过 tkinter.Variable.get 访问实例包装。方法。
def get_values():
values = []
for j in range(4):
column = []
for i in range(3):
column.append(entries[i][j].get())
values.append(column)

return values

最后,让我们创建一个按钮,以便我们打印当前值:
button = tk.Button(root, text="Print values", command=lambda: print(get_values()))
button.grid(row=3, column=0, columnspan=4)

现在,让我们调用 root.mainloop() ,看看会发生什么。
我们有一个条目矩阵,带有 Print values按钮:

entries matrix

现在如果我们输入一些文本然后点击 Print values :

Inputing values

这是控制台中出现的内容:
[['hello', '', ''], ['', 'stuff', ''], ['', '', 'blah'], ['foo', '', '']]

每时每刻,不仅在按下按钮时, get_values函数将返回条目矩阵的当前内容。
正如我所说,它会自动保持最新,因此您不必担心绑定(bind)。
这样做的明显优势是,用户不必按特定顺序输入他的输入,也不会被迫通过按 Tab 来切换条目。

编辑

现在要显示 column 2 的结果次 column 3在第四列。
由于我们已经处理了入口变量,因此编辑它们的文本非常直接。
我们所要做的就是通过 tk.Variable.trace 跟踪正在编辑的条目的事件。方法。
我首先定义一个 build_callback函数,它将两个源单元格的变量和目标单元格的变量作为参数。
def build_trace(source1, source2, target):
def callback(*_):
value1 = source1.get()
value2 = source2.get()
try:
value1 = float(value1)
value2 = float(value2)
target.set(value1*value2)
except:
target.set("")

return callback

这将创建一个回调,该回调获取两个源单元格的值,尝试将它们转换为浮点数,并将它们写入目标变量。
Tkinter 的变量是这样的,如果一个小部件被提供了一个变量,那么对后者的写访问将导致前者的视觉变化。
因此, target.set(value1*value2)不仅会设置 target 的内部值变量,但也会使关联条目显示新值。

现在,我们需要告诉 tkinter 在其中一个单元格被修改时调用正确的回调。
这很容易,但我们需要小心索引:
for i in range(3):
variables[i][1].trace(
'w',
build_trace(variables[i][1], variables[i][2], variables[i][3]))
variables[i][2].trace(
'w',
build_trace(variables[i][1], variables[i][2], variables[i][3]))

那么这是什么意思?
这告诉 tkinter 每当 variables[i][1]写成 ( 'w' ),回调 build_trace(variables[i][1], variables[i][2], variables[i][3])应该被执行。 build_trace函数被调用,其结果作为第二个参数传递。
这个结果是内部的 callback功能。
由于回调是用一些我们并不真正关心的参数调用的,我只是通过定义 callback(*_) 来吸收它们。 ,这基本上意味着“接受所有参数,并将它们放入 _ ,即垃圾箱中”。

现在您可以开始了,对第二列或第三列的任何更改都会导致第四列的更改。

有点自我广告,但我认为值得一读:
  • Python 3: Tkinter: How to change Entry.get() into an integer
  • Tkinter: restrict entry data to float
  • 关于python - 当我们在 tkinter 的 Text 小部件中清除它时,如何从列表中删除一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46210508/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com