python 3.5 tkinter.listbox改变大小

时间:2016-08-22 07:07:07

标签: python python-3.x tkinter listbox

有人可以告诉我以下代码有什么问题吗?我尝试构建一个tkinker.listbox,其尺寸可以使用.config命令更改,但失败了。相反,它会产生"属性错误的错误:' MovListbox'对象没有属性''"代码附在下面供您参考。

非常感谢。

import tkinter

def test():
    root = tkinter.Tk()

    list = ['  1','2','  3','4','5','  6','7','8','  9','10']
    a = MovListbox(root, list)
    a._setup_style(200, 200, EXTENDED)

class MovListbox(tkinter.Listbox):    

    def __init__(self, master=None, inputlist=None):
#        super(MovListbox, self).__init__()

        global NewsClassify_catList
        NewsClassify_catList = tkinter.Listbox(master)
        NewsClassify_catList.grid(row = 0 , column = 0, columnspan=2, sticky=N)    

        '''populate the news category onto the listbox'''
        for i in range (0, inputlist.__len__()):
            NewsClassify_catList.insert(END, inputlist[i])

        master.mainloop()

    def _setup_style(self, height=100, width=100, mode=EXTENDED):
        self.config(height=height, width=width, selectmode=mode)

if __name__ == '__main__':
    test()     

1 个答案:

答案 0 :(得分:1)

我对您的代码做了一些修改;它可能不完全是你想要的,但你应该觉得它很有帮助。

列表框宽度和高度选项不是像素测量;它们根据字符指定维度,因此height=12使列表框12文本行变高,width=40使列表框变为40个字符宽。

import tkinter as tk

def test():
    root = tk.Tk()
    lst = ['  1', '2', '  3', '4', '5', '  6', '7', '8', '  9', '10']
    a = MovListbox(root, lst)
    a.grid(row=0, column=0, columnspan=2, sticky=tk.N)
    a.setup_style(12, 40, tk.EXTENDED)
    root.mainloop()

class MovListbox(tk.Listbox):
    def __init__(self, master=None, inputlist=None):
        super(MovListbox, self).__init__(master=master)

        # Populate the news category onto the listbox
        for item in inputlist:
            self.insert(tk.END, item)

    def setup_style(self, height=10, width=20, mode=tk.EXTENDED):
        self.config(height=height, width=width, selectmode=mode)

if __name__ == '__main__':
    test()

如果您愿意,可以删除a.setup_style(12, 40, tk.EXTENDED)中的test()来电,而不是

self.setup_style(12, 40, tk.EXTENDED)

MovListbox.__init__()方法的末尾。

我已将您的list变量更改为lstlist对于变量名称来说不是一个好选择,因为它会影响内置的list类型,这可能会让人感到困惑,而且还会导致神秘的错误。

super内置函数用于访问父类的方法。来自the docs

  

super([type [,object-or-type]])

     

返回将方法调用委托给父或者的代理对象   兄弟姐妹类型。这对于访问继承的方法很有用   在课堂上被覆盖的。搜索顺序与此相同   getattr()使用,除了跳过类型本身。

因此

super(MovListbox, self).__init__(master=master)

表示调用MovListbox类的父类的__init__方法,换句话说,tk.Listbox.__init__方法。我们需要这样做,因为MovListbox是从tk.Listbox派生的,我们需要为我们的MovListbox实例设置所有常用的Listbox内容,然后才开始用它来做额外的事情,比如从inputlist插入字符串。 / p>

如果派生类没有定义自己的__init__方法,则在创建派生类的实例时会自动调用父项中的__init__方法。但是因为我们已经为MovListbox定义了一个__init__方法,而是调用了新的__init__。因此,要为MovListbox执行通常的Listbox初始化,我们需要手动调用Listbox的__init__,并且以优雅方式执行此操作的习惯方法是使用super

实际上,在Python 3中,可以简化super调用:

super().__init__(master)

我之前使用的表单在Python 2中是必需的。但是,super仅适用于新式类(Python 3支持的唯一类),但不幸的是,Python 2 Tkinter使用了古老的类 - 其窗口小部件的样式类,并在此类上调用super会引发TypeError异常。 :(当使用旧式类时,我们必须通过显式指定父类来执行调用,如下所示:

tk.Listbox.__init__(self, master)

该语法在Python 3中也有效,但在它可用时通常首选使用super