我怎样才能使 python tkinter 中的一组条目像 excel sheet 一样工作,方法是按 enter 和 tab 键移动单元格

How can i make a group of entries in python tkinter work like an excel sheet by pressing enter and tab to move cells

请问如何使我创建的条目像 Excel sheet 一样工作,这样当我按下回车键时,它会转到该列的下一个单元格(条目),或者当我按 Tab 键,它会将我带到该行的下一个单元格(条目)。

假设您已经按照从左到右、从上到下的顺序创建了行,Tab 键的行为将自动执行您想要的操作。

要在行之间上下移动,您需要绑定到 <Return> 事件。绑定函数需要确定当前行,然后将焦点设置到下一行。

这是一个工作示例,说明了将条目小部件保存在列表列表中的技术,以便可以通过行号和列号轻松检索任何给定的小部件,并使用 gridgrid_info 来确定小部件在哪一行和哪一列。

在此示例中,如果您在底行按 return 键,焦点将移动到顶行。

import tkinter as tk

class Example():
    def __init__(self):
        self.root = tk.Tk()
        self.table = tk.Frame(self.root)
        self.table.pack(fill="both", expand=True)

        self.rows = []
        for row in range(10):
            row_entries = []
            self.rows.append(row_entries)
            for column in range(4):
                entry = tk.Entry(self.table)
                entry.grid(row=row, column=column)
                row_entries.append(entry)

                entry.bind("<Return>", self.handle_enter)

    def handle_enter(self, event):
        # get the row and column of the entry that got the event
        entry = event.widget
        row = int(entry.grid_info()['row'])
        column = int(entry.grid_info()['column'])

        # compute the new row; either the next row or circle
        # back around to the first row
        new_row = row+1 if row+1 < len(self.rows) else 0

        # get the entry for the new row, and set focus to it
        entry = self.rows[new_row][column]
        entry.focus_set()

example = Example()
tk.mainloop()
import tkinter as tk

from tkinter import *


class Example():

    def __init__(self):
        self.root = tk.Tk()
        self.table = tk.Frame(self.root)
        self.table.pack(fill="both", expand=True)

        name = Label(self.table, font=("Helvetica", 10, "bold"), text='Company').grid(row=0, column=0,sticky=W)
        year1 = Label(self.table, font=("Helvetica", 10, "bold"), text='1999').grid(row=0, column=1,sticky=E)
        year2 = Label(self.table, font=("Helvetica", 10, "bold"), text='2000').grid(row=0, column=2,sticky=E)
        year3 = Label(self.table, font=("Helvetica", 10, "bold"), text='2001').grid(row=0, column=3,sticky=E)

        # Setting values for the first column as string variables
        me1 = StringVar()
        me2 = StringVar()
        me3 = StringVar()
        me4 = StringVar()
        me5 = StringVar()
        me6 = StringVar()
        me7 = StringVar()

        # Setting values for the second column as float variables
        dwe1 = DoubleVar()
        dwe2 = DoubleVar()
        dwe3 = DoubleVar()
        dwe4 = DoubleVar()
        dwe5 = DoubleVar()
        dwe6 = DoubleVar()
        dwe7 = DoubleVar()

        # Setting values for the third column as float variables
        fpe1 = DoubleVar()
        fpe2 = DoubleVar()
        fpe3 = DoubleVar()
        fpe4 = DoubleVar()
        fpe5 = DoubleVar()
        fpe6 = DoubleVar()
        fpe7 = DoubleVar()

        # Setting values for the fourth column as float variables
        bfe1 = DoubleVar()
        bfe2 = DoubleVar()
        bfe3 = DoubleVar()
        bfe4 = DoubleVar()
        bfe5 = DoubleVar()
        bfe6 = DoubleVar()
        bfe7 = DoubleVar()

        # Putting each of the values in a list for easy calling latter
        rt = [0,[me1,dwe1,fpe1,bfe1],[me2,dwe2,fpe2,bfe2],[me3,dwe3,fpe3,bfe3],[me4,dwe4,fpe4,bfe4],[me5,dwe5,fpe5,bfe5],[me6,dwe6,fpe6,bfe6],[me7,dwe7,fpe7,bfe7]]


        self.rows = []
        for row in range(1,8):
            row_entries = []
            self.rows.append(row_entries)
            for column in range(4):
                entry = tk.Entry(self.table,width=10, textvariable=rt[row][column], bd=4, bg='white')
                entry.grid(row=row, column=column)
                row_entries.append(entry)

                entry.bind("<Return>", self.handle_enter)

    def handle_enter(self, event):
        # get the row and column of the entry that got the event
        entry = event.widget
        row = int(entry.grid_info()['row'])
        column = int(entry.grid_info()['column'])

        # compute the new row; either the next row or circle
        # back around to the first row
        new_row = row if row < len(self.rows) else 0

        # get the entry for the new row, and set focus to it
        entry = self.rows[new_row][column]
        entry.focus_set()

example = Example()

tk.mainloop()

This is how it looks