如何在Tkinter的输入网格中使用List设置textvariable

0 投票
2 回答
95 浏览
提问于 2025-04-14 17:46

我创建了一个5x5的tkinter输入框网格,用户可以在里面输入数据。请问如何获取和设置选定输入框中的数据呢?

from tkinter import *
def print_value(entry):
    print( entry.get())
    uservalue[i,j].set('tessting')

root = Tk()
uservalue = []

height = 5
width = 1
for i in range(height): #Rows
    for j in range(width): #Columns
 entry = Entry(root, textvariable = uservalue[i,j], width=100)  # this line give me error 
        entry.grid(row=i, column=j)
        b = Button(root, text="print value", command= lambda entry=entry: print_value(entry), width=10)
        b.grid(row=i, column=j+1)

mainloop()

如何使用 list[i,j] 来设置文本变量,以便获取和设置用户在输入网格中的输入内容?

2 个回答

0

我想这可能是你想要的内容:

from tkinter import *

def print_value(row, col):
    print(uservalue[row][col].get())


# def print_value(var):
#   print(var.get())
    

root = Tk()
uservalue = []

height = 5
width = 5
for i in range(height): #Rows
    uservalue.append([])
    for j in range(width): #Columns
        var = StringVar()
        uservalue[i].append(var)
        entry = Entry(root, textvariable=var, width=100)
        entry.grid(row=i, column=j*2)
        # b = Button(root, text="print value", command= lambda var=var: print_value(var), width=10)
        b = Button(root, text="print value", command= lambda row=i, col=j: print_value(row, col), width=10)
        b.grid(row=i, column=j*2+1)

mainloop()

  • 多维列表(就是里面有列表的列表)需要用 my_list[x][y] 这种方式来访问,而不是 my_list[x,y]
  • textvariable= 这个参数需要一个 tkinter.Variable 的实例,或者它的子类(比如 tkinter.StringVar)。
  • 这意味着你首先得创建一个 StringVar() 的实例。
  • 然后你可以把它添加到列表里,并用它来设置你的输入框(Entry widget)。
0

把字符串变量添加到一个包含行和列的二维列表中。要获取某个值,可以用 list[row][column].get() 这样的方式。

import tkinter as tk

def get_val(row, col):
    table[row][col] = entry_vars[row][col].get()

root = tk.Tk()

height = 5
width = 1

# create a sample data

table = [[''] for i in range(height) for j in range(width)]

# List to hold Entry widget variables
entry_vars = []

# Create Entry widgets for each cell
for i in range(height):
    row_vars = []
    for j in range(width):
        var = tk.StringVar()
        var.set(table[i][j])
        entry = tk.Entry(root, textvariable=var)
        entry.grid(row=i, column=j)
        entry.bind('<FocusOut>', lambda event, row=i, col=j: get_val(row, col))
        row_vars.append(var)
    entry_vars.append(row_vars)

root.mainloop()

撰写回答