Есть ли способ привязать к сетке элемент tkinter, который находится в классе, отличном от фрейма, к которому я хочу привязать его

#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()
  

введите описание изображения здесь