类型错误:类型对象:'Frame' 没有 len()

The*_*dxo 3 python tkinter typeerror

生成错误的简单 tkinker 程序,我以前从未见过: TypeError: object of type: 'Frame' has no len()

我完全不知道为什么会出现此错误,也不知道这意味着什么。

def gui ():
    window = tk.Tk()

    window.title('DudzRPG ' + version)

    #frames
    options = tk.Frame()
    options1 = tk.Frame()
    options2 = tk.Frame()

    #widgets
    image = tk.Canvas(bg='blue')

    opt1=tk.Button()
    opt2=tk.Button()
    opt3=tk.Button()
    opt4=tk.Button()

    #packs
    image.pack()

    options.pack()
    options1.pack()
    options2.pack()

    opt1.pack(options1)
    opt2.pack(options1)
    opt3.pack(options2)
    opt4.pack(options2)




    window.mainloop()
Run Code Online (Sandbox Code Playgroud)

该错误似乎源于:

options1 = tk.Frame()
options2 = tk.Frame()
Run Code Online (Sandbox Code Playgroud)

这对我没有意义,因为上面的行几乎相同:

options = tk.Frame()
Run Code Online (Sandbox Code Playgroud)

这是回溯:

Traceback (most recent call last):
  File "<string>", line 250, in run_nodebug
  File "C:\Users\I.S.B\Google Drive\Dudzo inc python workspace\project\python thing.py", line 56, in <module>
    gui()
  File "C:\Users\I.S.B\Google Drive\Dudzo inc python workspace\project\python thing.py", line 43, in gui
    opt1.pack(options1)
  File "C:\Python33\Lib\tkinter\__init__.py", line 1909, in pack_configure
    + self._options(cnf, kw))
  File "C:\Python33\Lib\tkinter\__init__.py", line 1108, in _options
    cnf = _cnfmerge(cnf)
  File "C:\Python33\Lib\tkinter\__init__.py", line 105, in _cnfmerge
    for c in _flatten(cnfs):
TypeError: object of type 'Frame' has no len()
Run Code Online (Sandbox Code Playgroud)

我的问题是,错误是什么意思,我该如何解决?

Bri*_*ius 5

您没有pack正确调用- 请参阅此处的文档。抛出错误是因为该pack函数没有将小部件作为位置参数。

您似乎有一种错误的印象,即pack指定哪个小部件是哪个小部件的子部件是函数的工作。事实上,当你创建一个小部件时,你必须告诉小部件它的父级是什么。以下是修复方法:

创建小部件时,第一个参数应该是小部件的预期父小部件:

opt1=tk.Button(options1)
opt2=tk.Button(options1)
opt3=tk.Button(options2)
opt4=tk.Button(options2)
Run Code Online (Sandbox Code Playgroud)

稍后,当您打包它们时,它们已经知道它们属于哪个小部件:

opt1.pack()
opt2.pack()
opt3.pack()
opt4.pack()
Run Code Online (Sandbox Code Playgroud)

然后,如果您忘记了,您需要开始 GUI 的主循环:

window.mainloop()
Run Code Online (Sandbox Code Playgroud)