Проблема с методом ".get()" в виджете "entry" модуля "tkinter".

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
Windows 11 (21H2)
Python 3.10.7
aiohttp 3.8.3
aiosignal 1.2.0
alabaster 0.7.12
anyio 3.6.1
argon2-cffi 21.3.0
argon2-cffi-bindings 21.2.0
arrow 1.2.3
astroid 2.12.10
asttokens 2.0.8
async-timeout 4.0.2
atomicwrites 1.4.1
attrs 22.1.0
autobahn 22.7.1
autopep8 1.6.0
Babel 2.10.3
backcall 0.2.0
bcrypt 4.0.0
beautifulsoup4 4.11.1
binaryornot 0.4.4
black 22.8.0
bleach 5.0.1
certifi 2022.9.24
cffi 1.15.1
chardet 5.0.0
charset-normalizer 2.1.1
click 8.1.3
cloudpickle 2.2.0
colorama 0.4.5
cookiecutter 2.1.1
cryptography 38.0.1
customtkinter 4.5.10
darkdetect 0.7.1
debugpy 1.6.3
decorator 5.1.1
defusedxml 0.7.1
diff-match-patch 20200713
dill 0.3.5.1
docutils 0.19
easygui 0.98.3
entrypoints 0.4
executing 1.0.0
fastjsonschema 2.16.2
flake8 4.0.1
frozenlist 1.3.1
hyperlink 21.0.0
idna 3.4
imagesize 1.4.1
inflection 0.5.1
intervaltree 3.1.0
ipykernel 6.15.3
ipython 7.34.0
ipython-genutils 0.2.0
ipywidgets 8.0.2
isort 5.10.1
jaraco.classes 3.2.2
jedi 0.18.1
jellyfish 0.9.0
Jinja2 3.1.2
jinja2-time 0.2.0
jsonschema 4.16.0
jupyter 1.0.0
jupyter_client 7.3.5
jupyter-console 6.4.4
jupyter-core 4.11.1
jupyter-server 1.18.1
jupyter-server-proxy 3.2.2
jupyterlab-pygments 0.2.2
jupyterlab-widgets 3.0.3
keyring 23.9.3
lazy-object-proxy 1.7.1
lxml 4.9.1
MarkupSafe 2.1.1
matplotlib-inline 0.1.6
mccabe 0.6.1
mistune 2.0.4
more-itertools 8.14.0
multidict 6.0.2
mypy-extensions 0.4.3
nbclient 0.6.8
nbconvert 7.0.0
nbformat 5.6.0
nest-asyncio 1.5.5
notebook 6.4.12
numpy 1.23.3
numpydoc 1.4.0
packaging 21.3
pandocfilters 1.5.0
paramiko 2.11.0
parso 0.8.3
pathspec 0.10.1
pexpect 4.8.0
pickleshare 0.7.5
Pillow 9.2.0
pip 22.3
platformdirs 2.5.2
pluggy 1.0.0
prometheus-client 0.14.1
prompt-toolkit 3.0.31
psutil 5.9.2
ptyprocess 0.7.0
pure-eval 0.2.2
pycodestyle 2.8.0
pycparser 2.21
pydocstyle 6.1.1
pyflakes 2.4.0
Pygments 2.13.0
pylint 2.15.3
pyls-spyder 0.4.0
PyNaCl 1.5.0
pyparsing 3.0.9
PyQt5 5.15.7
PyQt5-Qt5 5.15.2
PyQt5-sip 12.11.0
PyQtWebEngine 5.15.6
PyQtWebEngine-Qt5 5.15.2
pyrsistent 0.18.1
python-dateutil 2.8.2
python-lsp-black 1.2.1
python-lsp-jsonrpc 1.0.0
python-lsp-server 1.5.0
python-slugify 6.1.2
pytoolconfig 1.2.2
pytz 2022.2.1
pywin32 304
pywin32-ctypes 0.2.0
pywinpty 2.0.8
PyYAML 6.0
pyzmq 24.0.1
QDarkStyle 3.0.3
qstylizer 0.2.2
QtAwesome 1.1.1
qtconsole 5.3.2
QtPy 2.2.0
requests 2.28.1
rope 1.3.0
Rtree 1.0.0
Send2Trash 1.8.0
setuptools 63.2.0
simpervisor 0.4
six 1.16.0
sniffio 1.3.0
snowballstemmer 2.2.0
sortedcontainers 2.4.0
soupsieve 2.3.2.post1
Sphinx 5.2.0.post0
sphinxcontrib-applehelp 1.0.2
sphinxcontrib-devhelp 1.0.2
sphinxcontrib-htmlhelp 2.0.0
sphinxcontrib-jsmath 1.0.1
sphinxcontrib-qthelp 1.0.3
sphinxcontrib-serializinghtml 1.1.5
spyder 5.3.3
spyder-kernels 2.3.3
stack-data 0.5.0
terminado 0.15.0
text-unidecode 1.3
textdistance 4.5.0
three-merge 0.1.1
tinycss2 1.1.1
toml 0.10.2
tomli 2.0.1
tomlkit 0.11.4
tornado 6.2
traitlets 5.4.0
txaio 22.2.1
ujson 5.5.0
urllib3 1.26.12
vpython 7.6.4
watchdog 2.1.9
wcwidth 0.2.5
webencodings 0.5.1
websocket-client 1.4.1
whatthepatch 1.0.2
widgetsnbextension 4.0.3
wrapt 1.14.1
yapf 0.32.0
yarl 1.8.1

Здравствуйте, знатоки "Python"! Я в нем полный нуб. Только начинаю. Столкнулся с проблемой, гуглил, но так нигде не нашел решения. Я написал тестовую программу. В ней есть окно из "tkinter". На окне одно текстовое поле "entry" и один текст "label". При событии нажатия клавиш клавиатуры на текстовом поле вызывается функция, которая должна копировать введенный текст из поля "entry" и вставлять его в надпись "label". Также идет вывод "print" в консоль. Но проблема в том, что вывод и в "label", и в консоль почему-то запаздывает ровно на один шаг. Как будто текстовое поле "entry" не успевает обновиться! То есть, когда я ввожу "1", в консоль выводится пустое место. Когда я ввел уже "12", в консоль только выводится "1". Когда уже введено значение "123", в консоль приходит только еще "12". И так далее. В чем моя ошибка? Подскажите, пожалуйста! Очень надеюсь на вашу помощь!

Проблема.png

Python:
from tkinter import *
 
root = Tk()
root.title("Timer")
root.geometry("-600-300")
root.configure(bg='#CECECE')
root.lift()
root.wm_attributes("-topmost", True)
root.resizable(False, False)


def clear_hours(event):
            if hour_entry.get() == '00':
                  hour_entry.delete(0, END)
                

def check_hours(event):
      # ЗДЕСЬ ПРОБЛЕМА!
      a = hour_entry.get()
      print(a)
      var.set(hour_entry.get())
      # ЗДЕСЬ ПРОБЛЕМА!
    


hour=StringVar()
hour.set("00")
hour_entry = Entry(textvariable=hour,
                   font=("Arial Bold", 14, 'bold'),
                   justify=CENTER,
                   width=10)
hour_entry.grid(row=0, column=0)



var = StringVar()
var.set("Test")
lb = Label(master=root,
      font=("Arial Bold", 14),
      bd=4,
      padx=10,
      pady=10,
      relief=FLAT,
      textvariable = var)
lb.grid(row=1, column=0)


hour_entry.bind('<Button-1>', clear_hours)
hour_entry.bind('<KeyPress>', check_hours)


root.mainloop()
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
сделайте кнопку, по нажатию которой будет вставляться, так проще...
а у вас проблема, что функция отрабатывает раньше, чем появился текст в поле ввода...
можете с событиями фокуса виджета поле ввода попробовать что то сделать, но я бы сделал кнопку...
 
Последнее редактирование:

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
 
  • Мне нравится
Реакции: Malenkey

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
ну еще можно закостылить так)

Python:
from tkinter import *
import threading

root = Tk()
root.title("Timer")
root.geometry("-600-300")
root.configure(bg='#CECECE')
root.lift()
root.wm_attributes("-topmost", True)
root.resizable(False, False)


def clear_hours(event):
    if hour_entry.get() == '00':
        hour_entry.delete(0, END)


def check(event):
    thread = threading.Thread(target=check_hours, daemon=True)
    thread.start()


def check_hours():
    # ЗДЕСЬ ПРОБЛЕМА!
    a = hour_entry.get()
    print(a)
    # var.set(hour_entry.get())
    # ЗДЕСЬ ПРОБЛЕМА!


hour = StringVar()
hour.set("00")
hour_entry = Entry(textvariable=hour,
                   font=("Arial Bold", 14, 'bold'),
                   justify=CENTER,
                   width=10)
hour_entry.grid(row=0, column=0)

var = StringVar()
var.set("Test")
lb = Label(master=root,
           font=("Arial Bold", 14),
           bd=4,
           padx=10,
           pady=10,
           relief=FLAT,
           textvariable=var)
lb.grid(row=1, column=0)

hour_entry.bind('<Button-1>', clear_hours)
hour_entry.bind('<KeyPress>', check)

root.mainloop()
 
  • Мне нравится
Реакции: Malenkey

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
Спасибо за помощь!
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
ну еще можно закостылить так)

Python:
from tkinter import *
import threading

root = Tk()
root.title("Timer")
root.geometry("-600-300")
root.configure(bg='#CECECE')
root.lift()
root.wm_attributes("-topmost", True)
root.resizable(False, False)


def clear_hours(event):
    if hour_entry.get() == '00':
        hour_entry.delete(0, END)


def check(event):
    thread = threading.Thread(target=check_hours, daemon=True)
    thread.start()


def check_hours():
    # ЗДЕСЬ ПРОБЛЕМА!
    a = hour_entry.get()
    print(a)
    # var.set(hour_entry.get())
    # ЗДЕСЬ ПРОБЛЕМА!


hour = StringVar()
hour.set("00")
hour_entry = Entry(textvariable=hour,
                   font=("Arial Bold", 14, 'bold'),
                   justify=CENTER,
                   width=10)
hour_entry.grid(row=0, column=0)

var = StringVar()
var.set("Test")
lb = Label(master=root,
           font=("Arial Bold", 14),
           bd=4,
           padx=10,
           pady=10,
           relief=FLAT,
           textvariable=var)
lb.grid(row=1, column=0)

hour_entry.bind('<Button-1>', clear_hours)
hour_entry.bind('<KeyPress>', check)

root.mainloop()
Спасибо большое за помощь! Помогло!
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
ну еще можно закостылить так)

Python:
from tkinter import *
import threading

root = Tk()
root.title("Timer")
root.geometry("-600-300")
root.configure(bg='#CECECE')
root.lift()
root.wm_attributes("-topmost", True)
root.resizable(False, False)


def clear_hours(event):
    if hour_entry.get() == '00':
        hour_entry.delete(0, END)


def check(event):
    thread = threading.Thread(target=check_hours, daemon=True)
    thread.start()


def check_hours():
    # ЗДЕСЬ ПРОБЛЕМА!
    a = hour_entry.get()
    print(a)
    # var.set(hour_entry.get())
    # ЗДЕСЬ ПРОБЛЕМА!


hour = StringVar()
hour.set("00")
hour_entry = Entry(textvariable=hour,
                   font=("Arial Bold", 14, 'bold'),
                   justify=CENTER,
                   width=10)
hour_entry.grid(row=0, column=0)

var = StringVar()
var.set("Test")
lb = Label(master=root,
           font=("Arial Bold", 14),
           bd=4,
           padx=10,
           pady=10,
           relief=FLAT,
           textvariable=var)
lb.grid(row=1, column=0)

hour_entry.bind('<Button-1>', clear_hours)
hour_entry.bind('<KeyPress>', check)

root.mainloop()
А я еще так попробовал. С событием <KeyRelease>

Python:
from tkinter import *
import threading

root = Tk()
root.title("Timer")
root.geometry("-600-300")
root.configure(bg='#CECECE')
root.lift()
root.wm_attributes("-topmost", True)
root.resizable(False, False)


def clear_hours(event):
    if hour_entry.get() == '00':
        hour_entry.delete(0, END)


def check_hours(event):
    global hour_entry
    a = hour_entry.get()
    print(a)
    var.set(hour_entry.get())


hour = StringVar()
hour.set("00")
hour_entry = Entry(textvariable=hour,
                   font=("Arial Bold", 14, 'bold'),
                   justify=CENTER,
                   width=10)
hour_entry.grid(row=0, column=0)

var = StringVar()
var.set("Test")
lb = Label(master=root,
           font=("Arial Bold", 14),
           bd=4,
           padx=10,
           pady=10,
           relief=FLAT,
           textvariable=var)
lb.grid(row=1, column=0)

hour_entry.bind('<Button-1>', clear_hours)
hour_entry.bind('<KeyRelease>', check_hours)

root.mainloop()
 

Форум IT Специалистов