2016-08-28 3 views
1

Я хотел бы создать запись с Tkinter, где пользователь может ввести свой номер телефона, и текст динамически изменится, чтобы после его завершения он стал как +34 1234567890.Tkinter .icursor (* arg) странное поведение

В моем коде функция .icursor(n), используемая для установки положения курсора, сначала не работает должным образом, но затем превзошла префикс.

Это мой фрагмент кода (он относится к значительно большему).

from Tkinter import * 

def TelephoneCheck(self,Vari): 
    Plain = Vari.get() 
    Plain = list(Plain) 

    Plain_flat = [] 
    for element in Plain: 
     try: 
      check = int(element) 
      Plain_flat.append(element) 
     except: pass 

    if len(Plain_flat) > 2: 
     Plain_flat.insert(2,' ') 

    Plain = ''.join(Plain_flat) 
    Plain = '+'+Plain 

    self.istn.set(Plain) 

    self.InsertTelephoneNumber.icursor(len(Plain)) 



def CreateInsertTelephoneNumber(self,X,Y,color='white'): 
    self.istn = StringVar() 
    self.istn.trace('w', lambda name, index, mode, istn=self.istn: self.TelephoneCheck(istn)) 
    self.InsertTelephoneNumber = Entry(Body,textvariable=self.istn) 
    self.InsertTelephoneNumber.config(bg=color) 
    self.InsertTelephoneNumber.place(height=20,width=230,y=Y+27,x=X+245) 



def LabelBody(self,X,Y): 
    TelephoneText = Label(Body,text='Telephone Number *') 
    TelephoneText.place(y=Y+4,x=X+243) 
    self.CreateInsertTelephoneNumber(X,Y) 

Как вы видите, теоретически, позиция должна быть выставиться в конце строки каждый раз, когда пользователь добавляет номер. Я не могу понять, почему он работает как прелесть только после префикса, а не когда набирается первое число (это результат как +(Cursor here)3 вместо +3(Cursor here)).

Если требуется больше кода, я обновлю сообщение.

Спасибо за ваше время и помощь!

+0

«не работает должным образом» не имеет смысла. Что вы получаете, а не получаете точно? –

+0

@ParvizKarimli .курсор (позиция) должен перемещать курсор в указанную позицию. К сожалению, это не тогда, когда набирается первый символ. Поэтому я бы сказал, что это поведение «не работает правильно» ... – Mark

+0

Что вы сделали, чтобы отладить это? Вы распечатали значения переменных, чтобы проверить свои предположения? –

ответ

2

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

Самое простое решение запланировать изменение произойдет после того, как поведение по умолчанию с помощью after_idle:

Body.after_idle(self.InsertTelephoneNumber.icursor, len(Plain)) 
Смежные вопросы