#python-3.x #tkinter
#python-3.x #tkinter
Вопрос:
Я пишу симулятор D amp; D, используя tkinter в качестве графического интерфейса, однако, поскольку я хочу создать массив, в котором каждый индекс соответствует строке, в которой находится элемент, для меню опций я создал свой собственный класс, который включает необходимую им информацию, такую как список опций иStringVar . Однако, когда я запускаю программу, она не привязывает меню опций к фрейму, даже если объект был создан.
Полный код, если он вам нужен: https://pastebin.com/2FxBcUb2
основной класс, который выполняется:
class dndSimulator(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.iconbitmap(self, default="Ampersand_on_Black (1).ICO")
tk.Tk.wm_title(self, "Damp;D simulator")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartGame,MainMenu):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartGame)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
Мой фрейм (часть, в которой он вызывает класс выпадающего списка):
def addCharactersection(self, firstColumn):
teamid = (firstColumn//4)
self.removeDelete(firstColumn)
self.placeholders = self.moveelements(firstColumn, 1, len(self.teamUiItems[teamid])-1)
self.placeholders = self.placeholders[0]
self.charactersection = []
self.charactersection.append(dropdownMenu("",lstoffiles))
self.charactersection.append(tk.Entry(self))
self.charactersection.append(ttk.Button(self, text = "Commit", command = lambda: self.commitValues(firstColumn)))
self.teamUiItems[teamid].insert(self.placeholders, self.charactersection)
self.teamUiItems[teamid][self.placeholders][0].dropdowngrid(self.placeholders 2, 0,1)
self.teamUiItems[teamid][self.placeholders][1].grid(row = self.placeholders 2,column = 1, columnspan = 1)
self.teamUiItems[teamid][self.placeholders][2].grid(row = self.placeholders 2, column = 2, columnspan = 1)
#grid these
self.addDelete(firstColumn)
print(self.teamUiItems[teamid][self.placeholders])
и класс выпадающего меню:
class dropdownMenu(tk.Frame):
'''
create a dropdown menu where this class includes all the vars and stuff
'''
def __init__(self,default,list):
super(dropdownMenu, self).__init__()
self.default = default
self.list = list
self.menuvar = tk.StringVar()
self.menuvar.set(default)
self.menu = tk.OptionMenu(self,self.menuvar, *self.list)
def dropdowngrid(self,prow,pcolumn,pcolumnspan):
self.menu.grid(row = prow, column = pcolumn, columnspan = pcolumnspan)
def dropdownforget(self):
self.menu.grid_forget()
def dropdowninfo(self):
return {'row':self.menu.grid_info()['row'], 'column':self.menu.grid_info()['column'], 'columnspan':self.menu.grid_info()['columnspan']}
Я ожидаю, что он будет привязан к фрейму, который показан в правильном положении, однако он не отображается, даже если остальные элементы, которые остаются в классе frames, появляются.
Спасибо, если вы можете помочь, потому что я пытался исправить это в течение последнего часа или около того!
Комментарии:
1. если вы имеете в виду, что хотите создать сетку
dropdownMenu
, то вы можете это сделатьdropdownMenu().grid()
. Также есть лучшие способы создания выпадающих меню, если вы пытаетесь что-то еще с этим.2. что я пытаюсь сделать, так это создать класс, который содержит все необходимое для меню опций из tkinter, чтобы я мог поместить его в массив, который находится во фрейме. Что мне нужно, так это потренироваться в том, как создать сетку меню опций, которое находится внутри этого нового класса, который я внес в основной фрейм, где находится класс выбора add character .
3. Хм, если вы имеете в виду, что вы не видите меню опций в фрейме, когда фрейм виден, тогда это может быть много факторов, но я не уверен, что ?..
Ответ №1:
РЕДАКТИРОВАТЬ: после тестирования кода я могу подтвердить, что вы забыли использовать .pack()
для отображения фрейма. (Сначала я попробовал, .grid()
но ваш фрейм находится в окне, которое использует .pack()
)
Вы создаете свой фрейм dropdownMenu
self.charactersection.append(dropdownMenu("",lstoffiles))
и вы используете
self.teamUiItems[teamid][self.placeholders][0].dropdowngrid(self.placeholders 2, 0,1)
который выполняется .grid()
для OptionMenu
def dropdowngrid(self, ...):
self.menu.grid(...)
но optionmenu self.menu
находится внутри фрейма self
, и вы забыли self.pack()
После того, как я добавлю это, я смогу увидеть это в окне.
def dropdowngrid(self, ...):
self.menu.grid(...)
self.pack()