使用python中的tablelist包装器在tablelist中配置组合框的值

时间:2014-02-28 20:35:48

标签: python combobox tkinter tcl

基本上我的问题是在用python编写的表列表中配置组合框(不是直接用tcl)。我准备了一个可以演示问题的示例,但在此之前让我们看一下运行它所需的步骤:

  1. here复制tablelist包装并将其另存为'tablelist.py',然后将其放在示例代码目录中。
  2. here下载“tklib-0.5”并将“tableslist”目录从“modules”目录复制到示例代码目录。
  3. 这是代码:

    from tkinter import *
    from tkinter import ttk
    from tablelist import TableList
    
    class Window (Frame):
        def __init__(self):
    #       frame
            Frame.__init__(self)
            self.grid()
    #       tablelist
            self.tableList = TableList(self,
                                        columns = (0, "Parity"),
                                        editstartcommand=self.editStartCmd
                                        )
            self.tableList.grid()
    #       configure column #0 
            self.tableList.columnconfigure(0, editable="yes", editwindow="ttk::combobox")
    #       insert an item 
            self.tableList.insert(END,('Even'))
    
        def editStartCmd(self, table, row, col, text):
    #
    #       must configure "values" option of Combobox here! 
    #
            return
    
    def main():
        Window().mainloop()
    
    if __name__ == '__main__':
        main()
    

    正如您所看到的,它会产生一个具有初始值(偶数)的单个列/单元格窗口。通过单击单元格将出现组合框(因为使用“editstartcommand”)并且它没有任何值(无)。我知道要编辑单元格的小部件,必须使用“editwinpath”命令来获取临时小部件的路径名,但该方法只返回一个地址字符串,指向不可调用的组合框小部件。

    我很感激任何帮助或可能的解决方案。

1 个答案:

答案 0 :(得分:0)

我知道我回答自己的问题有点奇怪,但我希望将来对其他人有用。在TCL中阅读tablelist脚本和示例后,我找到了答案。答案有两个不同的部分,一个与包装器有关(python中的tablelist包装器,你可以找到它here),另一个部分与我的示例代码有关。首先,需要修改包装器,以在其“TableList”类的“configure”方法中包含小部件的路径名。这是修改后的版本:

def configure(self, pathname, cnf={}, **kw):
    """Queries or modifies the configuration options of the 
    widget.  

    If no option is specified, the command returns a list 
    describing all of the available options for def (see 
    Tk_ConfigureInfo for information on the format of this list).  
    If option is specified with no value, then the command 
    returns a list describing the one named option (this list 
    will be identical to the corresponding sublist of the value 
    returned if no option is specified).  If one or more 
    option-value pairs are specified, then the command modifies
    the given widget option(s) to have the given value(s); in 
    this case the return value is an empty string.  option may 
    have any of the values accepted by the tablelist::tablelist 
    command.
    """
    return self.tk.call((pathname, "configure") +
                 self._options(cnf, kw))

第二部分和最后一部分是“editstartcommand”(在我的示例代码“editStartCmd”方法的情况下)必须在其末尾返回其“text”变量的义务。当你点击它们时,这个技巧会阻止条目变为“无”。正确的示例代码形式是:

from tkinter import *
from tkinter import ttk
from tablelist import TableList

class Window (Frame):
    def __init__(self):
#       frame
        Frame.__init__(self)
        self.grid()
#       tablelist
        self.tableList = TableList(self,
                                    columns = (0, "Parity"),
                                    editstartcommand=self.editStartCmd
                                    )
        self.tableList.grid()
#       configure column #0 
        self.tableList.columnconfigure(0, editable="yes", editwindow="ttk::combobox")
#       insert an item 
        self.tableList.insert(END,('Even'))

    def editStartCmd(self, table, row, col, text):
#
#       must configure "values" option of Combobox here! 
#
        pathname = self.tableList.editwinpath()
        self.tableList.configure(pathname, values=('Even','Odd'))
        return text

def main():
    Window().mainloop()

if __name__ == '__main__':
    main()

就是这样,我希望它足够清楚。