2014-09-07 4 views
1

простого tkinker программы, которая генерирует ошибку я не видел раньше: TypeError: object of type: 'Frame' has no len()TypeError: объект типа: «Рама» не имеет 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() 

ошибка появляется в origonate из:

options1 = tk.Frame() 
options2 = tk.Frame() 

который dosn't сделать Sence мне, потому что выше линии практически идентична:

options = tk.Frame() 

вот отслеживающий:

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

мой вопрос, w hat означает, что ошибка, и как я могу ее исправить?

+0

вы r возникают из 'opt1.pack (options1)' down –

ответ

4

Вы не звоните pack правильно - см. here для документации. Ошибка вызывается из-за того, что функция pack не принимает виджет в качестве позиционного аргумента.

Похоже, что вы находитесь под неправильным впечатлением, что задание функции pack указывает, какой виджет является дочерним элементом этого виджета. Фактически, когда вы создаете виджет, вы должны указать виджету, каков его родитель. Вот как это исправить:

При создании виджетов, то первый аргумент должен быть виджет предназначен родительский виджет:

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

Тогда позже, когда вы упаковать их, они уже знают, что виджет они принадлежат :

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

Тогда в случае, если вы забыли, что вам нужно, чтобы начать основной цикл кода графического интерфейса:

window.mainloop() 
+0

, так что же означает сама ошибка? – Thedudxo

+0

В принципе, функция 'pack' ожидает кучу аргументов ключевого слова, но вы дали ей виджет, который вздор. Таким образом, независимо от того, что делает функция для обработки аргументов, это не то, что можно сделать с помощью виджета. В какой-то момент функция «len» вызывается в аргументе, которого нет, потому что вы дали ему виджет. – Brionius

+1

Короче говоря, ошибка - это способ функции 'pack' сказать« этот аргумент, это не тот тип, который я ожидал ». – Brionius

Смежные вопросы