Текстовые виджеты в виде списка

#python #list #text #tkinter #ttk

#python #Список #текст #tkinter #ttk

Вопрос:

Я пытаюсь создавать вкладки с текстом, используя Notebook виджет tkinter и Text widget. Я создал список tabs и Text виджетов, все идет как по маслу, за исключением add_tabs метода. Всякий раз, когда я нажимаю control-n для добавления новых вкладок только в первый раз, я получаю это исключение:

Исключение

Я понятия не имею, как я могу решить эту проблему спасибо, что помогли мне.

Спасибо.

 C:UsersImtiyazDesktop>python maintabtest.py
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:Python34libtkinter__init__.py", line 1482, in __call__
    return self.func(*args)
  File "maintabtest.py", line 32, in add_tabs
    self.nb.add(self._tabs[self.i],text="untitled")
IndexError: list index out of range
  

код:

 import tkinter.ttk as ttks
from tkinter import BOTH,LEFT
class mainbody:
    def __init__(self,master):
        self.master = master
        self._tabs = []
        self._text = []
        self.i = 1
        self.body = ttks.Frame(self.master)
        self.nb = ttks.Notebook(self.master)
        self.nb.pack(fill=BOTH,expand=1)
        self.body.pack(fill=BOTH,expand=1)

        self.initial_tab = ttks.Frame(self.nb)
        self.Inittext = ttks.tkinter.Text(self.initial_tab)
        self.Inittext.pack(fill=BOTH,expand=1)
        self.initial_tab.pack(fill=BOTH,expand=1)
        self._text.append()
        self.nb.add(self.initial_tab,text="first_tab")

        self.File_name = ttks.Entry(self.master)
        self.File_name.pack(side=LEFT)
        self.sbtn = ttks.Button(self.master,text="save_btn",command=lambda:self.save_())
        self.sbtn.pack(side=LEFT)
        self.master.bind('<Control-n>',self.add_tabs)

    def add_tabs(self,event):
        self._tabs.append(ttks.Frame())
        self.nb.add(self._tabs[self.i],text="untitled")
        self._text.append(ttks.tkinter.Text(self._tabs[self.i]))
        self._text[self.i].pack(fill=BOTH,expand=1)
        self.i = self.i   1

    def save_(self):
        self.fname = self.File_name.get()
        self._txt_id = self.nb.index('current')
        self.get_input = self._text[self._txt_id].get("1.0","end-1c")
        with open(self.fname,'w') as f:
            f.write(self.get_input)
if __name__ == "__main__":
    root = ttks.tkinter.Tk()
    mainbody(root)
    root.mainloop()
  

Комментарии:

1. Вы забыли добавить первую вкладку в список. Добавьте self._text.append(self.Inittext) куда-нибудь в свой __init__ .

2. Кстати, отладка занимает всего 10 секунд. Все, что я сделал, это добавил print(self._txt_id, self._text) в save_ , и это напечатало пустой список.

3. @Aran-Fey я добавляю, self._text.append(self._Inittext) теперь он работает, но он не добавляет Text виджет ко второму, а добавляет виджет к третьему. итак, я установил, self.i = 1 теперь он работает должным образом, но когда я добавляю новую вкладку только в первый раз, она выдает index out of range исключение, а затем ее работа становится идеальной

4. Вы также не добавили первую вкладку в self._tabs .

Ответ №1:

Ваша проблема в том, что self.i не синхронизировался с размером двух списков: self._tabs и self._text .

В принципе, вам не нужно self.i отслеживать индекс до последнего элемента из двух списков. Просто используйте -1 вместо self.i in add_tabs() для ссылки на последний элемент в списке, как показано ниже:

 import tkinter.ttk as ttks
from tkinter import BOTH,LEFT
from tkinter.messagebox import showinfo

class mainbody:
    def __init__(self,master):
        self.master = master
        self._tabs = []
        self._text = []
        self.body = ttks.Frame(self.master)
        self.nb = ttks.Notebook(self.master)
        self.nb.pack(fill=BOTH, expand=1)
        self.body.pack(fill=BOTH, expand=1)

        self.add_tabs("first_tab") # add the initial tab

        self.File_name = ttks.Entry(self.master)
        self.File_name.pack(side=LEFT)
        self.sbtn = ttks.Button(self.master, text="save_btn", command=self.save_file)
        self.sbtn.pack(side=LEFT)
        self.master.bind('<Control-n>', lambda e:self.add_tabs())

    def add_tabs(self, name="untitled"):
        self._tabs.append(ttks.Frame())
        self.nb.add(self._tabs[-1], text=name)
        self._text.append(ttks.tkinter.Text(self._tabs[-1]))
        self._text[-1].pack(fill=BOTH, expand=1)

    def save_file(self):
        self.fname = self.File_name.get().strip()
        if not self.fname == '':
            self._txt_id = self.nb.index('current')
            self.get_input = self._text[self._txt_id].get("1.0","end-1c")
            with open(self.fname, 'w') as f:
                f.write(self.get_input)
        else:
            showinfo('Warning', 'Please input filename')

if __name__ == "__main__":
    root = ttks.tkinter.Tk()
    mainbody(root)
    root.mainloop()