В tkinter, почему я должен использовать функцию 'grid' отдельно? - PullRequest
1 голос
/ 10 октября 2019

Я практиковался, как использовать tkinter.

Сначала я написал код, который создает виджет Combobox:

(В значении 'win' я назначил tk.Tk ())

combobox = ttk.Combobox(win).grid(column=0, row=0)
combobox["values"] = (1, 2, 3, 4, 5)

Но это не сработало.

Traceback (most recent call last):
    File ".../combobox.py", line 9, in <module>
        combobox["values"] = (1, 2, 3, 4, 5)
TypeError: 'NoneType' object does not support item assignment

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

combobox = ttk.Combobox(win)
combobox["values"] = (1, 2, 3, 4, 5)
combobox.grid(column=0, row=0)

Затемкод работал очень хорошо ...

Я также пытался выполнить этот код, и он тоже работал хорошо:

combobox = ttk.Combobox(win)
combobox.grid(column=0, row=0)
combobox["values"] = (1, 2, 3, 4, 5)

Почему первый неверен, а два последних верны?

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

В python, когда вы делаете x=foo().bar(), x будет присвоено возвращаемое значение bar().

Таким образом, когда вы делаете combobox = ttk.Combobox(win).grid(column=0, row=0), combobox присваивается значение от вызова grid(...), а вызов grid всегда возвращает None.

0 голосов
/ 10 октября 2019

В первом примере combobox не содержит ttk.Combobox(win), но фактически возвращает значение .grid(column=0, row=0). Это означает, что

combobox["values"] = (1, 2, 3, 4, 5)

фактически равно

ttk.Combobox(win).grid(column=0, row=0)["values"] = (1, 2, 3, 4, 5)

. Вот почему ваш второй пример работает, а первый - нет, потому что во втором примере combobox имеет значение ttk.Combobox(win)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...