Как заморозить строку / столбец при прокрутке холста tkinter? - PullRequest
0 голосов
/ 26 сентября 2019

В python tkinter Canvas я ищу способ заморозить первый столбец при горизонтальной прокрутке и заморозить первый ряд при вертикальной прокрутке.Нечто похожее на Excel, где заголовок столбца и строки могут быть зафиксированы в таблице.

Ниже приведен пример кода для базы данных клиентов.Этот код открывает окно с сеткой из Entry коробок / меток на холсте, где данные о клиентах могут быть введены для 100 клиентов.Табличный формат создается путем помещения полей ввода и меток в рамку, а затем размещения рамки на холсте с помощью create_window() в python

См. Изображение ниже, показывающее окно вывода tkinter с холстом,Если выходная сетка предполагается в виде таблицы, подобной Excel, строка 0 имеет метки (клиент 1, 2 ....), а в столбце 0 содержится описание данных, которые необходимо ввести.При прокрутке по x и y эти метки исчезают.Я пытаюсь сделать следующее:

  1. Способ заморозить столбец 0 (описание данных) при прокрутке в направлении x
  2. Заморозить строку 0 (номер клиента) при прокрутке в направлении y

Мой текущий код:

from tkinter import *

class database(Frame):
    def __init__(self, root, **kwargs):
        Frame.__init__(self, root, **kwargs)
        self.frame = Frame(root, background = "blue")

        self.scrolly = Scrollbar(self.frame, orient = "vertical")
        self.scrollx = Scrollbar(self.frame, orient = "horizontal")

        self.canvas = Canvas(self.frame, bg = "pink", width = 500, height = 175)
        self.canvas_frame = Frame(self.canvas)

        #List of customer details
        self.customer_database = ["Name", "DOB", "Address", "Phone No", "Hobbies", "Profession"]

        #Define the number of customer records to collect
        self.no_of_customers = 100

        #Creating an 2D array of entry widgets to collect customer records
        self.entry = [[Entry(self.canvas_frame) for i in range (self.no_of_customers)] for j in range (len(self.customer_database))]

        #Creating labels to display in a tabular form within a frame which will be inserted into a canvas using create_window
        for i in range(len(self.customer_database)):
            Label(self.canvas_frame, text = self.customer_database[i]).grid(row = i+1, column = 0)

        for i in range(self.no_of_customers):
            Label(self.canvas_frame, text = "customer " + str(i+1)).grid(row = 0, column = i+1)

        #Inserting the 2D entry widget array in the canvas frame
        for i in range(self.no_of_customers):
            for j in range(len(self.customer_database)):
                self.entry[j][i].grid(row = j+1, column = i+1)

        self.canvas.grid(row = 0, column = 0, sticky = "nsew")

        self.scrolly.grid(row = 0, column = 1, sticky = "ns")
        self.scrollx.grid(row = 1, column = 0, sticky = "ew")
        self.scrolly.config(command = self.canvas.yview)
        self.scrollx.config(command = self.canvas.xview)
        self.canvas.config(yscrollcommand = self.scrolly.set, xscrollcommand = self.scrollx.set)

        self.canvas.create_window(0,0, window = self.canvas_frame, anchor = "nw")
        self.canvas.bind("<Configure>", self.onFrameConfigure)

        self.frame.grid(row = 0, column = 1, sticky = "nsew")

    def onFrameConfigure(self, event):
        print("inside")
        self.canvas.configure(scrollregion = self.canvas.bbox("all"))


root = Tk()
frame = database(root)
root.geometry("400x400")
root.mainloop()

Выходное изображение:

screenshot of output image

...