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

Я пишу симулятор D & D, используя tkinter в качестве графического интерфейса, однако, потому что я хочу создать массив, в котором каждый индекс соответствует строке, в которой находится элемент, для опции Menu я создал свой собственный класс, который включает в себя информацию что им нужно, например, список опций и 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, "D&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']}

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

Спасибо, если вы можете помочь, потому что я пытался это исправить в течение последнего часа или около того!

1 Ответ

0 голосов
/ 21 апреля 2019

РЕДАКТИРОВАТЬ: после тестирования кода, я могу подтвердить, что вы забыли использовать .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()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...