如何从矩阵GUI tkinter更改值?



我想从矩阵中更改一个数字,然后在相同的tk窗口中显示它,但我发现很难从输入中使用变量。r[][]应为用户输入形成的矩阵。毕竟,我必须在相同的tk窗口中显示修改后的矩阵:r[0][1] += 5

from tkinter import *
import numpy as np
root = Tk()
def process():
values = [e1.get(),e2.get(),e3.get(),e4.get()]
a = np.zeros((2,2),dtype=np.int64)
for i in range(2):
for j in range(2):
a[i][j] = values[i*2+j]
print(a)
e1 = Entry(root)
e2 = Entry(root)
e3 = Entry(root)
e4 = Entry(root)
e1.grid(row=0,column=0,padx=10,pady=10)
e2.grid(row=0,column=1)
e3.grid(row=1,column=0,padx=10,pady=10)
e4.grid(row=1,column=1)
b = Button(root,text='Process',command=process)
b.grid(row=2,column=0,columnspan=4,sticky=E+W)
root.mainloop()
r=[[e1.get(),e2.get()],[e3.get(),e4.get()]]
r[0][1] += 5 

kinter GUI程序是事件驱动的,这需要使用与您可能熟悉的命令式编程不同的编程范式。换句话说,几乎所有发生的事情都是对用户所做的事情的响应,比如在键盘上打字,点击图形按钮,移动鼠标等等。

我认为下面的代码会给你一个很好的想法,如何做你想在这样的框架。它为每个Entry小部件创建一个StringVar,这样做的好处是,每当相应的StringVar更改时,每个Entry中显示的内容将自动更新(使其或多或少自动)。

要确定哪个StringVar与给定的Entry相关联,需要创建一个单独的字典,将内部tkinter变量名称映射到相应的Python变量。内部的tkinter变量名是通过通用的cget()widget方法获得的。

import tkinter as tk
from tkinter.constants import *
ROWS, COLS = 2, 2
def process(entry_widgets, row, col):
var_name = entry_widgets[row][col].cget('textvariable')
var = root.variables[var_name]
try:
value = float(var.get())
except ValueError:  # Something invalid (or nothing) was entered.
value = 0
var.set(value+5)  # Update value.

root = tk.Tk()
# Create a grid of Entry widgets.
entries = []
root.variables = {}  # To track StringVars.
for x in range(COLS):
row = []
for y in range(ROWS):
var = tk.StringVar(master=root)  # Create variable.
root.variables[str(var)] = var  # Track them by name.
entry = tk.Entry(root, textvariable=var)
entry.grid(row=x, column=y)
row.append(entry)
entries.append(row)

btn = tk.Button(root, text='Process', command=lambda: process(entries, 0, 1))
btn.grid(row=2, column=0, columnspan=COLS, sticky=E+W)
root.mainloop()

这是你想要的吗?我删除了一堆代码,这些代码在上下文中似乎没有任何作用——你只是想替换角落框中的文本,对吗?

from tkinter import *
def process():
replace(e4)
def replace(entry_loc):
temp = int(entry_loc.get())
temp += 5
entry_loc.delete(0,500)
entry_loc.insert(0, temp)

root = Tk()
var_e1 = StringVar
var_e2 = StringVar
var_e3 = StringVar
var_e4 = StringVar
e1 = Entry(root, textvariable=var_e1)
e2 = Entry(root, textvariable=var_e2)
e3 = Entry(root, textvariable=var_e3)
e4 = Entry(root, textvariable=var_e4)
e1.grid(row=0, column=0, padx=10, pady=10)
e2.grid(row=0, column=1)
e3.grid(row=1, column=0, padx=10, pady=10)
e4.grid(row=1, column=1)
b = Button(root, text='Process', command=process)
b.grid(row=2, column=0, columnspan=4, sticky=E + W)
root.mainloop()