Ошибка 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
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()

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