В python tkinter
Canvas
я ищу способ заморозить первый столбец при горизонтальной прокрутке и заморозить первый ряд при вертикальной прокрутке.Нечто похожее на Excel, где заголовок столбца и строки могут быть зафиксированы в таблице.
Ниже приведен пример кода для базы данных клиентов.Этот код открывает окно с сеткой из Entry
коробок / меток на холсте, где данные о клиентах могут быть введены для 100 клиентов.Табличный формат создается путем помещения полей ввода и меток в рамку, а затем размещения рамки на холсте с помощью create_window()
в python
См. Изображение ниже, показывающее окно вывода tkinter
с холстом,Если выходная сетка предполагается в виде таблицы, подобной Excel, строка 0 имеет метки (клиент 1, 2 ....), а в столбце 0 содержится описание данных, которые необходимо ввести.При прокрутке по x и y эти метки исчезают.Я пытаюсь сделать следующее:
- Способ заморозить столбец 0 (описание данных) при прокрутке в направлении x
- Заморозить строку 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()
Выходное изображение: