Способ ввода текста в поле ввода и его поиска?

#python-3.x #tkinter

#python-3.x #tkinter

Вопрос:

Я пытаюсь ввести информацию в поле ввода, а затем заставить функцию прочитать ее и вернуть оператор в зависимости от того, что было введено. Каждый раз, когда я запускаю программу и пробую ее, я получаю сбой с надписью «Ошибка типа может только объединить str (не «int) в str»

Я попытался установить текстовую запись как stringvar, а затем вызвать ее как часть функции для поиска этой переменной ввода, но, похоже, это ничего не меняет.

Это мой код:

 E = Entry(top,text='var',textvariable=var,bd=5)
def faultCodes():
    x = E.get()
    for x in E:
        if x == 500 or x == 514:
            print("Follow fault code 9621F4A4.")
        else:
            print("Enter a fault code.")
    label = Label(text=x).place(x=0,y=300)
  

Результаты, которые я ищу, — это то, что пользователь может ввести значение 500 или 514 и распечатать инструкцию.

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

1. Какова полная трассировка ошибки? В какой строке он находится?

2. Как вы думаете for x in E , что будет делать, учитывая, что E это виджет?

3. Rassar-ошибка в строке 1489, в cget Брайан — я думал, что добавление for цикла позволит этому коду выполняться как журнал, поскольку в поле ввода есть информация, но теперь я понимаю, что мне, вероятно, это не нужно. Я просто попытался извлечь его и запустить код — я больше не получаю сбой, но он также не запускает if цикл. Он просто печатает введенную информацию через кнопку отправки.

4. какая строка равна 1489? Всегда ставьте под сомнение полное сообщение об ошибке (полная трассировка), а не в комментарии. Есть много полезной информации. И это будет полезнее, чем текст error on line 1489

5. пожалуйста, добавьте минимальный и исполняемый пример

Ответ №1:

Вы можете создать кнопку для запуска кода, который будет получать текст из var.get() или из E.get() и что-то делать

 E = Entry(top, text='var', textvariable=var, bd=5)
E.pack()

B = Button(top, text='OK', command=faultCodes)
B.pack()

def faultCodes():
    entry_text = var.get()

    if entry_text == "500" or entry_text == "514":
         print("Follow fault code 9621F4A4.")
    else:
         print("Enter a fault code.")

    label = Label(top, text=entry_text)
    label.pack()
  

Или вы можете привязаться <Return> Entry к функции запуска при нажатии Enter Entry . Tkinter запустит функцию с event аргументом as, поэтому функция должна получить этот аргумент.

 E = Entry(top, text='var', textvariable=var, bd=5)
E.pack()

E.bind('<Return>', faultCodes)

def faultCodes(event):
    entry_text = var.get()

    if entry_text == "500" or entry_text == "514":
         print("Follow fault code 9621F4A4.")
    else:
         print("Enter a fault code.")

    label = Label(top, text=entry_text)
    label.pack()
  

Вы даже можете использовать оба метода с одной и той же функцией, если используете event=None

Полный рабочий пример

 from tkinter import *

def faultCodes(event=None):
    entry_text = var.get()

    if entry_text == "500" or entry_text == "514":
         print("Follow fault code 9621F4A4.")
    else:
         print("Enter a fault code.")

    label = Label(top, text=entry_text)
    label.pack()


top = Tk()

var = StringVar()
E = Entry(top, text='var', textvariable=var, bd=5)
E.pack()

E.bind('<Return>', faultCodes)

B = Button(top, text='OK', command=faultCodes)
B.pack()

top.mainloop()
  

КСТАТИ: var.get() выдает строку, поэтому я сравниваю со строками «500», «514», а не с целыми числами 500, 514.


РЕДАКТИРОВАТЬ: пример с Label

 from tkinter import *

# --- function ---

def faultCodes(event=None):
    entry_text = var.get()

    if entry_text == "500" or entry_text == "514":
         label['text'] = "Follow fault code 9621F4A4."
    else:
         label['text'] = "Enter a fault code."

# --- main ---

top = Tk()

var = StringVar()
E = Entry(top, text='var', textvariable=var, bd=5)
E.pack()

E.bind('<Return>', faultCodes)

B = Button(top, text='OK', command=faultCodes)
B.pack()

label = Label(top, text='')
label.pack()

top.mainloop()
  

РЕДАКТИРОВАТЬ: пример со словарем

 from tkinter import *

data = {
    "500": "Follow fault code 9621F4A4.",
    "514": "Follow fault code 9621F4A4.",
    # ...add more ...
}

# --- function ---

def faultCodes(event=None):
    entry_text = var.get()

    if entry_text in data:
         label['text'] = data[entry_text]
    else:
         label['text'] = "Enter a fault code."

# --- main ---

top = Tk()

var = StringVar()
E = Entry(top, text='var', textvariable=var, bd=5)
E.pack()

E.bind('<Return>', faultCodes)

B = Button(top, text='OK', command=faultCodes)
B.pack()

label = Label(top, text='')
label.pack()

top.mainloop()
  

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

1. Я пробовал эти методы, но каждый раз, когда я ввожу что-то в поле ввода и нажимаю кнопку, оно возвращает то же значение, которое я ввел в качестве метки. Я предполагаю, что это связано с тем, что метка в функции установлена как label = Label(text=entry_text) . Как мне заставить его возвращать требуемые операторы в виде метки?

2. если вам нужен другой текст в label, используйте другой текст в Label(text="differen text")

3. Моя проблема в том, что он не печатает оператор, который находится в if цикле в функции. Если я ввожу 500 в качестве значения в поле ввода, оно должно печататься Follow fault code 9621F4A4. , но вместо этого оно просто повторяет переменную entry_text . Как я могу заставить цикл в функции действительно работать правильно?

4. как я уже говорил ранее — используйте Label(text="Follow fault code 9621F4A4")

5. Вы имеете в виду назначить метку в цикле, например label = Label(text="Follow fault code 9621F4A4") , потому что это возвращает ошибку ссылки на метку перед назначением. Если вы имеете в виду назначение метки как таковой вне цикла, то она работает не так, как я предполагал, потому что она всегда будет отображать эту метку, независимо от того, какие значения вводятся.