Как я могу заставить группу записей в Python Tkinter работать как лист Excel, нажав Enter и Tab для перемещения ячеек - PullRequest
0 голосов
/ 09 июня 2019

Пожалуйста, как я могу заставить созданные мной записи работать как лист Excel, чтобы при нажатии клавиши ввода они переходили к следующей ячейке (записи) вдоль этого столбца или когда я нажимал клавишу табуляции, они переносили меня на следующую ячейку?(запись) вдоль этого ряда.

Ответы [ 2 ]

0 голосов
/ 23 июля 2019
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()

Так выглядит

0 голосов
/ 10 июня 2019

Предполагая, что вы создали строки по порядку слева направо и сверху вниз, поведение клавиши табуляции автоматически сделает то, что вы хотите.

Для перемещения вверх и вниз между строками вам нужнопривязать к событию <Return>.Связанная функция должна определить текущую строку, а затем установить фокус на следующую строку.

Вот рабочий пример, который иллюстрирует технику сохранения виджетов ввода в списке списков, чтобы любой заданный виджет можно было легко найти по номеру строки и столбца, и используя grid и grid_info для определенияв какой строке и столбце находится виджет.

В этом примере фокус перемещается в верхнюю строку, если вы нажимаете клавишу возврата в нижней строке.

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