Ошибка Tkinter OptionMenu

У меня возникли проблемы с тем, чтобы мой OptionMenu работал, первая проблема заключается в том, что он не работает, мне нужно использовать какой-то ярлык-заполнитель, чтобы заставить его работать. поэтому в приведенном ниже примере это работает, если я использую TaxYear в качестве основного, но не, если я использую TaxYearLi.

Вторая проблема заключается в том, что по какой-то причине w.set («2018/2019») не работает, я получаю сообщение об ошибке, что я передаю строку, а не строку.

Редактировать: Хорошо, я исправил проблему StringVar и установил значение по умолчанию, чтобы определить root как Tk.Tk (), если бы кто-то также мог объяснить, почему это нужно сделать, это было бы полезно.

import Tkinter as Tk

root = Tk.Tk()
w = Tk.StringVar
w.set("2018/2019")

TaxYear = Tk.Label(text = "Select tax year")
TaxYear.grid(row=1, column=0)

TaxYearLi = Tk.OptionMenu(TaxYearLi, w, "2018/2019")
TaxYearLi.grid(row=1,column=1)

Tk.mainloop()

Первым параметром OptionMenu() (как и всех виджетов Tkinter) является родительский виджет - возможно, root в вашем случае. Вы не можете передать сам виджет для этого параметра не только потому, что эта переменная еще даже не существует! (Вам также необходимо передать родительский виджет при вызове Label(), вы получаете значение по умолчанию, а не имеете никакого контроля над процессом.)

jasonharper 11.04.2018 14:10

@jasonharper, спасибо за вашу помощь, когда вы говорите, что я получаю значение по умолчанию, а не контролирую процесс, что вы имеете в виду под этим, можете ли вы привести мне пример того, какой контроль мне будет не хватать. извините, но я новичок в Tkinker и довольно новичок в python

adam Wadsworth 11.04.2018 14:22

Если вы не укажете родительский виджет, Tkinter по умолчанию использует корневое окно (я думаю, с первого вызова Tk()). Любая достаточно сложная компоновка окна Tkinter, вероятно, будет иметь много виджетов, которые являются дочерними элементами Frames (или других контейнеров) вместо корневого, и поэтому не могут быть созданы, если вы фактически не укажете родительский элемент.

jasonharper 11.04.2018 14:36

@jasonharper ах, так что лучше сделать фрейм родительским для связки связанных виджетов?

adam Wadsworth 11.04.2018 15:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
322
1

Ответы 1

Если вам нужно объявить переменную (в вашем случае root) как TK (), это потому, что Tk () - это класс в коде Tkinter, который в основном создает окно, запрашивая его в вашей ОС. поэтому вам нужно создать переменную (некоторые называют ее root, другие master, другие родители), которая будет вашим корневым / главным / родительским окном, и каждый виджет должен быть в этой переменной.

Теперь о вашем OptionMenu, как я уже упоминал, вам нужно поместить все свои виджеты в главное окно (root в вашем случае)

import Tkinter as Tk

root = Tk.Tk()
w = Tk.StringVar #in Python3 i need to put StringVar() i don't know about 2.x
w.set("2018/2019")

TaxYear = Tk.Label(text = "Select tax year")
TaxYear.grid(row=1, column=0)
TaxYearLi = Tk.OptionMenu(root, w, "2018/2019") #needs to be on the root window
TaxYearLi.grid(row=1,column=1)

root.mainloop()

Другие вопросы по теме