如何从矩阵 GUI tkinter 更改值?

How to change values from a matrix GUI tkinter?

我想更改矩阵中的数字,然后在同一个 tk 中显示它 window,但我发现很难使用输入中的变量。 r[][] 应该是用户输入形成的矩阵。毕竟我必须在同一个 tk window.

中显示经过修改的矩阵: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 

这就是您要找的吗?我删除了一堆在上下文中似乎什么都不做的代码——你只是想替换角落框中的文本,对吗?

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()

Tkinter GUI 程序是 event-driven which requires using a different programming paradigm than the one you're probably familiar with which is called imperative 编程。换句话说,几乎所有发生的事情都是为了响应用户所做的事情,比如在键盘上打字、点击图形按钮、移动鼠标​​等。

我认为下面的代码会让您很好地了解如何在这样的框架中执行您想要的操作。它为每个 Entry 小部件创建一个 StringVar,其优点是每个 Entry 中显示的内容将在相应的 StringVar 更改时自动更新(使更多或-少自动)。

为了确定哪个 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()