【发布时间】:2016-05-29 10:21:17
【问题描述】:
说明
我想为 Tkinter 制作一个自定义 "Table Widget",到目前为止,这几乎是我想要的。
我的问题是我希望表格包含"Labels",我只发现您必须使用"StringVar()'s" 才能更新标签。
我真的不想为 1000 个标签使用 1000 个变量,所以我已经尝试解决这个问题一周了。我发现的唯一解决方案是使用"Dicts",但我认为这不是一个好方法吗?我可能错了,但感觉它必须是一种方法来做这样的事情:
myLabel = Label(root, text='myText')
myLabel.pack()
myLabel.setText('new text')
当前小部件代码如下所示(This is my first custom widget so if this is horribly wrong or wrong in any way, please tell me)
来源
"""
Description:
A TABLE WIDGET Extension for Tkinter
"""
try:
#Python 3.X
import tkinter #this is quite annoyng, without it (tkinter) wont be available....
from tkinter import * # even with this
from tkinter import ttk
from tkinter.ttk import *
except ImportError:
#python 2.X
import tkinter
from Tkinter import *
from Tkinter import ttk
from Tkinter.ttk import *
class ETable(tkinter.Frame):
def __init__(self, parent, *args, **kwargs):
tkinter.Frame.__init__(self, parent)
self.init_table(parent, *args, **kwargs)
def init_table(self, parent, *args, **kwargs):
row_settings = {
'anchor': CENTER,
'background': '#C5FFFF',
'bitmap': None,
'borderwidth': 5,
'compound': None,
'cursor': None,
'font': None,
'foreground': '#000000',
'image': None,
'relief': FLAT,
'rows': 1,
'state': NORMAL,
'text': None,
'textvariable': None,
'underline': -1,
'width': 20,
}
for kwarg in kwargs:
if kwarg in row_settings:
row_settings[kwarg] = kwargs[kwarg]
self.table_rows = self.init_row(parent, *args, **row_settings)
def init_row(self, parent, *args, **kwargs):
text_list = kwargs.pop('text')
row_list = []
cols = []
rows = kwargs.pop('rows')
for row in range(rows):
for col in range(len(text_list)):
tempLabel = Label(parent, text = text_list[col], *args, **kwargs)
tempLabel.grid(row=row, column=col)
cols.append(tempLabel)
row_list.append(cols)
return row_list
目标
我希望能够做这样的事情
table.getRow[0][0].setText('new text') #This would change col 1 in row 1 to "new text"
奖金问题
(please tell me if I should make a new question for this)
正如我所说,我想为 Tkinter 创建一个 "Table Widget",但我还想向表格添加行为,即当用户单击一行时,我希望该行扩展 "Downwards",就像 @ 987654334@ 但它只会在失去焦点时关闭,这里的目标是添加"Entry or Text boxes" 以便编辑列。
这里的问题是,Tkinter 可以做到这一点吗?
【问题讨论】:
-
啊,在任何人问之前,是的,我之前已经搜索过这个,有一个类似但不完全的“stackoverflow”问题,这就是我创建自定义小部件的灵感。
-
我已经添加了一个答案,希望你喜欢。有关您的第二个问题的一些信息,请参阅 Bryan 的回答 here 和 linked question。要一次操作整行小部件,请考虑将每一行放在自己的 Frame 中。