У меня возникли проблемы с тем, чтобы мой 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()
@jasonharper, спасибо за вашу помощь, когда вы говорите, что я получаю значение по умолчанию, а не контролирую процесс, что вы имеете в виду под этим, можете ли вы привести мне пример того, какой контроль мне будет не хватать. извините, но я новичок в Tkinker и довольно новичок в python
Если вы не укажете родительский виджет, Tkinter по умолчанию использует корневое окно (я думаю, с первого вызова Tk()
). Любая достаточно сложная компоновка окна Tkinter, вероятно, будет иметь много виджетов, которые являются дочерними элементами Frames (или других контейнеров) вместо корневого, и поэтому не могут быть созданы, если вы фактически не укажете родительский элемент.
@jasonharper ах, так что лучше сделать фрейм родительским для связки связанных виджетов?
Если вам нужно объявить переменную (в вашем случае 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()
Первым параметром
OptionMenu()
(как и всех виджетов Tkinter) является родительский виджет - возможно,root
в вашем случае. Вы не можете передать сам виджет для этого параметра не только потому, что эта переменная еще даже не существует! (Вам также необходимо передать родительский виджет при вызовеLabel()
, вы получаете значение по умолчанию, а не имеете никакого контроля над процессом.)