小编典典

Tkinter,自定义小部件和标签更新

python

描述

我想"Table Widget"为Tkinter做一个定制,到目前为止,这几乎是我想要的。

我的问题是我希望表包含"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)

就像我说的那样,我想"Table Widget"为Tkinter创建一个,但我也想向用户在表中添加行为,即IE,当用户单击一行时,我希望该行"Downwards"像a一样展开,"Dropdown Menu"但只有在失去焦点时才会关闭,这里的目标是添加"Entry or Text boxes"以编辑列。

这里的问题是,Tkinter可以做到吗?


阅读 211

收藏
2020-12-20

共1个答案

小编典典

我只发现您必须使用“ StringVar()”来更新标签。

这不是一个真实的陈述。您可以使用config/configure方法更新任何窗口小部件的属性。从第一个示例开始,它看起来像这样:

myLabel = Label(root, text='myText')
myLabel.pack()
myLabel.configure(text='new text')

并且,在最后一个示例中:

table.getRow[0][0].configure(text='new text')

至于奖励问题,是的,有可能。您可以将所需的任何代码绑定到标签,就像绑定任何其他小部件一样,除了绑定键和鼠标按钮之外,还可以绑定获取或失去焦点。

2020-12-20