描述
我想"Table Widget"为Tkinter做一个定制,到目前为止,这几乎是我想要的。
"Table Widget"
我的问题是我希望表包含"Labels",但我只发现必须使用"StringVar()'s"它来更新标签。
"Labels"
"StringVar()'s"
我真的不想要1000个标签的1000个变量,所以我已经尝试解决了一个星期的问题。我发现的唯一解决方案是使用,"Dicts"但是我不认为这是一个好方法?我可能是错的,但感觉它必须是一种执行以下操作的方法:
"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)
(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)
就像我说的那样,我想"Table Widget"为Tkinter创建一个,但我也想向用户在表中添加行为,即IE,当用户单击一行时,我希望该行"Downwards"像a一样展开,"Dropdown Menu"但只有在失去焦点时才会关闭,这里的目标是添加"Entry or Text boxes"以编辑列。
"Downwards"
"Dropdown Menu"
"Entry or Text boxes"
这里的问题是,Tkinter可以做到吗?
我只发现您必须使用“ StringVar()”来更新标签。
这不是一个真实的陈述。您可以使用config/configure方法更新任何窗口小部件的属性。从第一个示例开始,它看起来像这样:
config
configure
myLabel = Label(root, text='myText') myLabel.pack() myLabel.configure(text='new text')
并且,在最后一个示例中:
table.getRow[0][0].configure(text='new text')
至于奖励问题,是的,有可能。您可以将所需的任何代码绑定到标签,就像绑定任何其他小部件一样,除了绑定键和鼠标按钮之外,还可以绑定获取或失去焦点。