Как изменить положение курсора в виджете ввода Python tkinter при каждом добавленном и удаленном значении - PullRequest
0 голосов
/ 29 августа 2018

У меня есть одно поле ввода и всплывающее окно клавиатуры. Каждый раз, когда пользователь нажимает на поле ввода, он принимает ввод через клавиатуру. Одна из проблем, с которой я сталкиваюсь при чтении текущей позиции курсора при вводе пользовательского ввода, всегда показывает положение курсора на нуле, и пользователь не видит курсора в поле ввода при вводе с клавиатуры.

Код:

from tkinter import *
from tkinter import simpledialog

class Gui(Toplevel):
    def __init__(self, parent,*args):
        Toplevel.__init__(self, parent)
        self.title('User input window')
        self.geometry('450x350')
        self.EntryVar=StringVar()
        self.label = Label(self, text='User Input:', width=15, background='white', justify=CENTER,
                                  font='-weight bold')
        self.entry = Entry(self, width=15, background='white', textvariable=self.EntryVar,
                                  font='-weight bold')
        self.label.grid(row=2,padx=10, pady=5, column=0, sticky='E')
        self.entry.grid(row=2,padx=10, pady=5, column=1, sticky='E')
        self.entry.bind('<FocusIn>', self.keypad_popup)

    def keypad_popup(self,event):
        new = numPad(self, event.widget)

class numPad(simpledialog.Dialog):
    def __init__(self, parent, *args):
        self.focus = args[0]
        self.parent = parent
        self.top = Toplevel(parent)
        self.top.title('Keypad')
        self.top.grab_set()
        self.createWidgets()

    def createWidgets(self):
        btn_list = ['6', '1', '2', '3', '0','C', 'D']
        r = 1
        c = 0
        n = 0
        btn = []
        for label in btn_list:
            cmd = lambda x=label: self.click(x)
            button = Button(self.top, text=label, width=10, height=5, command=cmd)
            btn.append(button)
            btn[-1].grid(row=r, column=c)
            n += 1
            c += 1
            if c == 3:
               c = 0
               r += 1

    def click(self, label):
        if label == 'D' and self.focus == self.parent.entry:
            currentText = self.parent.EntryVar.get()
            self.parent.EntryVar.set(currentText[:-1])

        elif label == 'C':
            self.top.destroy()
            self.top.master.focus()

        elif self.focus == self.parent.entry:
            currentText = self.parent.entry.get()
            self.parent.EntryVar.set(currentText + label)
            print('Cursor position:', self.parent.entry.index(INSERT))


if __name__ == '__main__':
    root = Tk()
    root.title('root window')
    root.geometry("150x150")
    app = Gui(root)
    root.mainloop()

1 Ответ

0 голосов
/ 29 августа 2018

Установка значения через связанную переменную не изменяет позицию курсора, если только предыдущая позиция не выходила за конец нового значения. Поскольку позиция курсора начинается с 0, а вы его не меняете, он всегда будет нулевым.

Если вы хотите убедиться, что курсор вставки находится в конце после изменения значения, вы можете использовать метод icursor.

Пример:

self.parent.entry.icursor("end")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...