Создание таблицы look-a-like Tkinter
Я ищу, чтобы создать что-то, что напоминает таблицу в Tkinter, но это не обязательно должно быть таковым.
Я хотел бы создать заголовки "Name1", "Name2", "Value", например, и под каждым из них я хочу иметь несколько пустых строк.
эти строки я затем хочу заполнить позже (поэтому метку) значениями, которые я рассчитал, или строковыми значениями для имен.
для "Name2" я бы хотел, чтобы весь столбец был выпадающим меню. Я уже создали код для одного самостоятельно, но не уверены, как включить его в эту "таблицу".
возможно ли, например, создать границу вокруг виджета метки, чтобы он выглядел как "таблица"?
любые указатели на то, что было бы возможно в этой ситуации, будут очень оценены. Если вам нужен какой-либо из моих кодов, чтобы что-то сделать, просто спросите. Спасибо!
2 ответов
какие у вас проблемы? Простое решение-выложить виджеты с помощью grid
. Вы можете поместить любой тип виджета, который вы хотите в каждой ячейке. И да, ярлыки могут иметь границы. Хотя простой способ сделать линии сетки - использовать отступ вокруг каждой ячейки, чтобы цвет рамки показывался через промежутки.
сделайте это в кадре. Если вам нужно прокрутить таблицу, поместите рамку внутри холста и добавьте полосы прокрутки. Есть примеры по всему интернету для как создать прокручиваемую рамку с помощью холста.
вот очень быстрый пример, который использует только метки и не прокручивается. Я оставлю именно то, что вам нужно в качестве упражнения для читателя.
import Tkinter as tk
class ExampleApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
t = SimpleTable(self, 10,2)
t.pack(side="top", fill="x")
t.set(0,0,"Hello, world")
class SimpleTable(tk.Frame):
def __init__(self, parent, rows=10, columns=2):
# use black background so it "peeks through" to
# form grid lines
tk.Frame.__init__(self, parent, background="black")
self._widgets = []
for row in range(rows):
current_row = []
for column in range(columns):
label = tk.Label(self, text="%s/%s" % (row, column),
borderwidth=0, width=10)
label.grid(row=row, column=column, sticky="nsew", padx=1, pady=1)
current_row.append(label)
self._widgets.append(current_row)
for column in range(columns):
self.grid_columnconfigure(column, weight=1)
def set(self, row, column, value):
widget = self._widgets[row][column]
widget.configure(text=value)
if __name__ == "__main__":
app = ExampleApp()
app.mainloop()
довольно простое решение без объекта, которое я нашел:
from Tkinter import *
rows = []
for i in range(5):
cols = []
for j in range(4):
e = Entry(relief=RIDGE)
e.grid(row=i, column=j, sticky=NSEW)
e.insert(END, '%d.%d' % (i, j))
cols.append(e)
rows.append(cols)
def onPress():
for row in rows:
for col in row:
print col.get(),
print
Button(text='Fetch', command=onPress).grid()
mainloop()
или
# simple 2d table
from Tkinter import *
for i in range(5):
for j in range(4):
l = Label(text='%d.%d' % (i, j), relief=RIDGE)
l.grid(row=i, column=j, sticky=NSEW)
mainloop()