У меня проблема с тем, что, когда я пытаюсь написать свое приложение с графическим интерфейсом, используя классы, я не могу получить верный макет. Возможно, это потому, что я новичок в ООП с 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()
Ниже я ожидаю, как будет выглядеть графический интерфейс. (Как это выглядит, когда я не использую классы и строю их прямо)
и вот как это выглядит, когда я использую классы и дает мне неправильное размещение