#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-разрядная. А у тебя что?