Как получить доступ к атрибуту класса для наложения текстового поля внутри фрейма, используя Tkinter и Python3 - Layout не работает правильно - PullRequest
0 голосов
/ 01 ноября 2019

У меня проблема с тем, что, когда я пытаюсь написать свое приложение с графическим интерфейсом, используя классы, я не могу получить верный макет. Возможно, это потому, что я новичок в ООП с Python, но не могу заставить виджет Tk.TextBox правильно масштабировать и позиционировать себя в GUI.

Если я пишу свой GUI без каких-либо классов и собираюGUI прямо, тогда я получаю результаты, которые я хочу отлично. Проблема заключается в том, что я отделяю класс Frame, который я использую для конкретной страницы, а затем создаю другой класс, унаследованный от Tk.Text, и пытаюсь поместить поле под Page Frame. Я попытался получить доступ к классу Page в методе init для класса Text, но я получил неразрешенную ошибку атрибута. Ниже приведен код, который я использую, я отредактировал кучу функций кнопок и регистраторов, чтобы сохранить его как можно меньше.

class SNMPPage(tk.Frame):
    def __init__(self, root=None):
        tk.Frame.__init__(self, root)
        self.root = root
        self.root.title('SNMP Get Set Test')
        self.filename = None
        self.process = None
        self.init_gui()

    def init_gui(self):
        self.grid()
        '''' Input Boxes'''
        tk.Label(self, text='IP Address').grid(column=0, row=0, sticky=tk.EW)
        tk.Label(self, text="Edited").grid(column=0, row=1, sticky=tk.EW)
        tk.Label(self, text="#edited").grid(column=0, row=2, sticky=tk.EW)
        tk.Label(self, text="Timeout (in seconds)").grid(column=0, row=3, sticky=tk.EW)

        self.e1 = tk.Entry(self)
        self.e2 = tk.Entry(self)
        self.e3 = tk.Entry(self, show="*")
        self.e4 = tk.Entry(self)

        self.e1.grid(row=0, column=1, sticky=tk.W)
        self.e1.insert(10, '#edited out')
        self.e2.grid(row=1, column=1, sticky=tk.W)
        self.e2.insert(10, '#edite out')
        self.e3.grid(row=2, column=1, sticky=tk.W)
        self.e3.insert(10, '#edited Out')
        self.e4.grid(row=3, column=1, sticky=tk.W)
        self.e4.insert(10, '180')

        ''' Buttons'''
        tk.Button(self, text='Run SNMP Get/Set', command=self.start_batch_callback).grid(row=5, column=0, sticky=tk.W)
        tk.Button(self, text='Quit', command=self.quit_batch_program).grid(row=5, column=1, sticky=tk.W)
        tk.Button(self, text='Create Batch', command=self.create_batch).grid(row=5, column=2, sticky=tk.W)
        tk.Button(self, text='Ping', command=self.start_ping_callback).grid(row=0, column=2, sticky=tk.W)

class TextBox(tk.Text):
    def __init__(self):
        tk.Text.__init__(self, state='disabled', wrap='word', bg='black', fg='green', font='fixedsys')
        self.init_textbox()

    def init_textbox(self):
        self.grid(row=6, column=0, columnspan=4, sticky=tk.NSEW)
        tk.Button(self, text='Clear', command=self.clear_button).grid(row=7, column=3, sticky=tk.W)

    def clear_button(self):
        try:
            self.config(state='normal')
            self.delete('1.0', tk.END)
        except Exception as e:
            loggermodule.module_logger.debug(e)

def main():
    root = tk.Tk()
    app = SNMPPage(root)
    mytext = TextBox()
    stderrHandler = logging.StreamHandler()
    loggermodule.module_logger.addHandler(stderrHandler)
    guiHandler = GuiHandlerText(mytext)
    guiHandler.setFormatter(formatter)
    loggermodule.module_logger.addHandler(guiHandler)
    loggermodule.module_logger.setLevel(logging.DEBUG)
    mytextscroll = tk.Scrollbar(app, command=mytext.yview, orient="vertical")
    mytextscroll.grid(row=6, column=3, sticky="ns")
    mytext.configure(yscrollcommand=mytextscroll.set)

    root.mainloop()

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

Correct GUI using no classes

и вот как это выглядит, когда я использую классы и дает мне неправильное размещение

Incorrect Gui using classes

...