Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python 3.5 tkinter.listbox更改大小_Python_Python 3.x_Tkinter_Listbox - Fatal编程技术网

python 3.5 tkinter.listbox更改大小

python 3.5 tkinter.listbox更改大小,python,python-3.x,tkinter,listbox,Python,Python 3.x,Tkinter,Listbox,谁能告诉我下面的代码出了什么问题?我尝试构建一个tkinker.listbox,其中的维度可以用.config命令更改,但失败了。相反,它会产生“AttributeError:'MovListbox'对象没有属性'tk'”的错误。下面附上代码供您参考 非常感谢 import tkinter def test(): root = tkinter.Tk() list = [' 1','2',' 3','4','5',' 6','7','8',' 9','10']

谁能告诉我下面的代码出了什么问题?我尝试构建一个tkinker.listbox,其中的维度可以用.config命令更改,但失败了。相反,它会产生“AttributeError:'MovListbox'对象没有属性'tk'”的错误。下面附上代码供您参考

非常感谢

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()     

我对你的代码做了一些修改;这可能不完全是你想要的,但你应该发现它很有用

列表框宽度和高度选项不是像素测量值;它们以字符为单位指定尺寸,因此
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\u样式(12,40,tk.EXTENDED)
调用
test()
,而不是

self.setup_style(12, 40, tk.EXTENDED)
MovListbox.\uuuu init\uuuu()
方法的末尾

我已将您的
列表
变量更改为
lst
<代码>列表对于变量名来说不是一个好的选择,因为它隐藏了内置的
列表
类型,这可能会造成混淆,也可能导致神秘的bug


super
内置函数用于访问父类的方法。发件人:

super([type[,object或type]])

返回代理对象,该代理对象将方法调用委托给父对象或 类型的兄弟类。这对于访问继承的方法很有用 已在类中重写的。搜索顺序与此相同 由getattr()使用,但类型本身被跳过

因此

表示调用MovListbox类的父类的
\uuuuu init\uuuu
方法,换句话说,就是
tk.Listbox.\uuuuu init\uuuu
方法。我们需要这样做,因为MovListbox是从tk.Listbox派生的,我们需要为MovListbox实例设置所有常用的Listbox内容,然后再开始使用它做额外的工作,比如插入
inputlist
中的字符串

如果派生类没有定义自己的
\uuuuu init\uuuuu
方法,则在创建派生类的实例时,会自动调用父类的
\uuuuuuuu init\uuuuuu
方法。但是因为我们已经为MovListbox定义了一个
\uuuuu init\uuuu
方法,所以会调用新的
\uuuuu init\uuu
。因此,要为MovListbox执行通常的Listbox初始化,我们需要手动调用Listbox的
\uuuu init\uuuu
,通常的方法是使用
super

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

super().__init__(master)
我前面使用的表单在Python 2中是必需的。然而,
super
仅适用于新型类(Python 3支持的唯一类),但不幸的是,Python 2 Tkinter将古老的老式类用于其小部件,对此类类调用
super
会引发
TypeError
异常(在使用旧式类时,我们必须通过显式指定父类来执行调用,如下所示:

tk.Listbox.__init__(self, master)

这种语法在Python3中也是有效的,但通常在可用时最好使用
super

我对您的代码做了一些修改;这可能不是您想要的,但您应该会发现它很有用

列表框宽度和高度选项不是像素测量值;它们以字符为单位指定尺寸,因此
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\u样式(12,40,tk.EXTENDED)
调用
test()
,而不是

self.setup_style(12, 40, tk.EXTENDED)
MovListbox.\uuuu init\uuuu()
方法的末尾

我已将您的
list
变量更改为
lst
list
对于变量名来说不是一个好的选择,因为它会隐藏内置的
list
类型,这可能会造成混淆,也可能导致神秘的错误


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

super([type[,object或type]])

返回代理对象,该代理对象将方法调用委托给父对象或 类型的同级类。这对于访问继承的方法很有用 已在类中重写的。搜索顺序与 由getattr()使用,但类型本身被跳过

因此

说调用MovListbox类的父类的
\uuuuuu init\uuuuu
方法,换句话说,
tk.Listbox.\uuuuuu init\uuuu
方法。我们需要这样做,因为MovListbox是从tk.Listbox派生的,我们需要为MovListbox实例设置所有常用的Listbox内容,然后再开始使用它做额外的工作,比如从
inputlist
插入字符串

如果派生类没有定义自己的
\uuuuu init\uuuuu
方法,那么当您创建派生类的实例时,会自动调用父类的
\uuuu init\uuuuu
方法。但是,因为我们为MovListbox定义了一个
\uuu init\uuuuuuu
方法,所以会调用新的
\uuu init\uuuuuu
,以获得通常的为MovListbox执行的istbox初始化我们需要手动调用Listbox的
\uuuu init\uuuu
,通常的方法是使用
super

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

super().__init__(master)
我前面使用的表单在Python2中是必需的。然而,
super
仅适用于新样式的类(Python3支持的唯一类),但不幸的是,Python2 Tkinter将古老的旧样式类用于其小部件,对此类类调用
super
会引发
TypeError
异常(当使用旧式类时,我们必须通过显式指定父类来执行调用,如