_кинтер_.Ошибка TclError: неверный индекс списка «»: должен быть активным, привязанным, конечным, @x,y или числом с записью.select_adjust(КОНЕЦ)

#python #tkinter #select #tkinter-entry

Вопрос:

У меня есть проблема с entry.select_adjust() . Код выглядит так, как показано ниже.

Ошибка произошла в self.rename_entry_mpf.select_adjust(КОНЕЦ). Если я удалю эту строку, программа будет работать правильно. Но я хочу выделить имя файла, когда я нажимаю на файл для переименования. Вот почему я использовал select_adjust. С помощью «select_adjust», когда я нажимаю на файл, запись создается, а имя файла отображается и выделяется. Затем я пишу что угодно, даже если я нажал только кнопку возврата, произошла ошибка.

Я отредактировал свой пост, и код почти такой же, как ниже.

 
def mpf_db(self):
    self.lb_frm_mpf = LabelFrame(frame_photo, text="program")
    self.lb_frm_mpf.pack(side="left", fill="both", expand=True)
    self.lb_frm_db = LabelFrame(frame_photo, text="profile")
    self.lb_frm_db.pack(side="right", fill="both", expand=True)
    self.sbarx_lstbx_mpf = Scrollbar(self.lb_frm_mpf, orient="horizontal")
    self.sbarx_lstbx_mpf.pack(side="bottom", fill="x")
    self.sbary_lstbx_mpf = Scrollbar(self.lb_frm_mpf, orient="vertical")
    self.sbary_lstbx_mpf.pack(side="right", fill="y")
    self.sbarx_lstbx_db = Scrollbar(self.lb_frm_db, orient="horizontal")
    self.sbarx_lstbx_db.pack(side="bottom", fill="x")
    self.sbary_lstbx_db = Scrollbar(self.lb_frm_db, orient="vertical")
    self.sbary_lstbx_db.pack(side="right", fill="y")
    self.name_list = os.listdir(r"C:BartMy libraryPythonGrinding")
    self.lstbx_mpf = Listbox(self.lb_frm_mpf, selectmode="extended", height=14, xscrollcommand=self.sbarx_lstbx_mpf.set, yscrollcommand=self.sbary_lstbx_mpf.set)
    self.lstbx_mpf.pack(fill="both", expand=True)
    self.lstbx_db = Listbox(self.lb_frm_db, selectmode="extended", height=14, xscrollcommand=self.sbarx_lstbx_db.set, yscrollcommand=self.sbary_lstbx_db.set)
    self.lstbx_db.pack(fill="both", expand=True)
    self.sbarx_lstbx_mpf.config(command=self.lstbx_mpf.xview)
    self.sbary_lstbx_mpf.config(command=self.lstbx_mpf.yview)
    self.sbarx_lstbx_db.config(command=self.lstbx_db.xview)
    self.sbary_lstbx_db.config(command=self.lstbx_db.yview)
    self.lstbx_mpf.delete(0, END)
    self.lstbx_db.delete(0, END)
    for file in self.name_list:
        if file.endswith(".mpf"):
            self.lstbx_mpf.insert(END, file)
        elif file.endswith(".db"):
            self.lstbx_db.insert(END, file)
    self.lstbx_mpf.bind("<Button-3>", self.right_click_mpf)
    self.lstbx_db.bind("<Button-3>", self.right_click_db)
    self.lstbx_db.bind("<Double-Button-1>", self.doubl_left_click_db)
    self.root.bind("<Button-1>", self.rename_cancel)
def right_click_mpf(self, event):
    if self.rename_act_mpf == 1:
        self.rename_entry_mpf.destroy()
        self.rename_act_mpf = 0
    if self.rename_act_db == 1:
        self.rename_entry_db.destroy()
        self.rename_act_db = 0
    self.x_place, self.y_place = event.x, event.y
    self.lstbx_mpf.selection_clear(0, END)
    self.lstbx_mpf.selection_set(self.lstbx_mpf.nearest(event.y))
    self.lstbx_mpf.activate(self.lstbx_mpf.nearest(event.y))
    self.menu = Menu(self.root, tearoff=0)
    self.menu.add_command(label="삭제", command=self.delete_mpf)
    self.menu.add_command(label="이름변경", command=self.rename_mpf)
    try:
        self.menu.tk_popup(event.x_root, event.y_root)
    finally:
        self.menu.grab_release()

def right_click_db(self, event):
    if self.rename_act_db == 1:
        self.rename_entry_db.destroy()
        self.rename_act_db = 0
    if self.rename_act_mpf == 1:
        self.rename_entry_mpf.destroy()
        self.rename_act_mpf = 0
    self.x_place, self.y_place = event.x, event.y
    self.lstbx_db.selection_clear(0, END)
    self.lstbx_db.selection_set(self.lstbx_db.nearest(event.y))
    self.lstbx_db.activate(self.lstbx_db.nearest(event.y))
    self.menu = Menu(self.root, tearoff=0)
    self.menu.add_command(label="삭제", command=self.delete_db)
    self.menu.add_command(label="이름변경", command=self.rename_db)
    try:
        self.menu.tk_popup(event.x_root, event.y_root)
    finally:
        self.menu.grab_release()

def rename_mpf(self):
    self.rename_entry_mpf = Entry(self.lb_frm_mpf, bg="yellow")
    self.rename_entry_mpf.place(x=0, y=16 * self.lstbx_mpf.nearest(self.y_place))
    self.rename_entry_mpf.insert(0, self.lstbx_mpf.get(self.lstbx_mpf.curselection()))
    self.rename_entry_mpf.focus()
    self.rename_entry_mpf.select_adjust(END)
    self.rename_entry_mpf.bind("<Return>", self.rename_enter_mpf)
    self.rename_act_mpf = 1

    def rename_enter_mpf(self, event):
    if self.rename_entry_mpf.get().endswith(".mpf"):
        os.rename(self.lstbx_mpf.get(self.lstbx_mpf.curselection()), self.rename_entry_mpf.get())
    else:
        os.rename(self.lstbx_mpf.get(self.lstbx_mpf.curselection()), self.rename_entry_mpf.get()   ".mpf")
    self.rename_entry_mpf.destroy()
    self.rename_act_mpf = 0
    self.lstbx_mpf.delete(0, END)
    self.name_list = os.listdir(r"C:BartMy libraryPythonGrinding")
    for file in self.name_list:
        if file.endswith(".mpf"):
            self.lstbx_mpf.insert(END, file)

 

Даже я написал любое имя, но оно введено «». Как я могу решить эту проблему?

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

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

2. Я бы рискнул предположить из сообщения об ошибке, что это Listbox ошибка, а не Entry ошибка. Этот тип ошибки может быть вызван попыткой получить данные из списка без данных или из списка, в котором нет активного курсора выбора. Если это так, то заполните поле списка некоторыми данными и используйте self.lstbx_mpf.select_set(0) для активации курсора выбора.

3. Ошибка произошла в self.rename_entry_mpf.select_adjust(КОНЕЦ). Если я удалю эту строку, программа будет работать правильно. Но я хочу выделить имя файла, когда я нажимаю на файл для переименования. Вот почему я использовал select_adjust. С помощью «select_adjust», когда я нажимаю на файл, запись создается, а имя файла отображается и выделяется. Затем я пишу что угодно, даже если я нажал только кнопку возврата, произошла ошибка.

4. Я пытался сгенерировать ошибку, но мне не повезло. Поэтому я намеренно изменил lstbx_mpf lstbx_db в вашем коде, как это self.rename_entry_mpf.insert(0, self.lstbx_mpf.get(self.lstbx_db.curselection())) , что привело к ошибке _tkinter.TclError: bad listbox index "": must be active, anchor, end, @x,y, or a number

5. Я решил эту проблему. После того, как self.rename_entry_mpf.select_adjust(КОНЕЦ) в def переименование_mpf(self) курсор будет удален, но я не знаю, почему. Поэтому я добавил self.cur_sel_mpf = self.lstbx_mpf.curselection() прямо перед self.rename_entry_mpf.select_adjust(КОНЕЦ) и изменил os.rename(self.lstbx_mpf.get( self.lstbx_mpf.curselection()), self.rename_entry_mpf.get()) в os.rename(self.lstbx_mpf.get(self.cur_sel_mpf), self.переименовать_entry_mpf.get()). Может быть, это проблема с версией. Вы сказали, что вас устраивает мой код. Моя версия 3.8.6 32-разрядная. А у тебя что?