【问题标题】:How to change values from a matrix GUI tkinter?如何从矩阵 GUI tkinter 更改值?
【发布时间】:2021-12-11 05:33:20
【问题描述】:

我想从矩阵中更改一个数字,然后将其显示在同一个 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 

【问题讨论】:

  • 那么你的问题是什么?您是否只想在销毁 gui 后保留变量 r 而不会引发错误?
  • 你应该从学习事件驱动编程开始
  • 简单地接受答案不是应该做的,您应该花时间仔细阅读所有答案并选择一个最适合您的答案。

标签: python user-interface tkinter matrix tkinter-entry


【解决方案1】:

Tkinter GUI 程序是event-driven,它需要使用不同于您可能熟悉的称为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()

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • var_e1 = StringVar 不会像您认为的那样做。它必须是var_e1 = StringVar()。不过,在这段代码中使用StringVar 完全没用。
猜你喜欢
  • 1970-01-01
  • 2021-09-10
  • 2017-03-29
  • 2018-01-19
  • 2022-01-12
  • 2019-11-17
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
相关资源
最近更新 更多