Как изменить вывод на нижний регистр в Tkinter?

#python #tkinter

Вопрос:

Я впервые использую Tkinter в python. Я пытаюсь сделать вывод, который пользователь ввел в нижнем регистре. Поэтому, если ввести «ТЕСТ», то на выходе будет «тест».

Мой код таков:

 from tkinter import *

# event functions (10:30 mins)
def onClickSubmitButton():                      # submit button event handler
        userEnteredText = textbox.get()         # get the enterd text from the Entry text box
        outputTextField.delete(0.0, END)        # (14:30 mins)delete all of the output field text contents
        outputTextField.insert(END, userEnteredText)  # (15:50 mins) output the user eneterd text




#main window (1:30 mins)
window = Tk()
window.title("Python Glossary")
window.configure(background="white")

# display text using - Label  (05:30 mins)
Label(window, text="Enter a string and press submit", bg="white", font="none 12 bold").grid(row=1,column=0,sticky=W) # using grid layout

# textbox for text entry - Entry (8:15 mins)
textbox = Entry(window, width=20, bg="white")
textbox.grid(row=2, column=0,sticky=W)          # grid position of textbox

# submit button - Button (9:30 mins) - calls onClickSubmitButton function when clicked
Button(window, text="SUBMIT", width=6, command=onClickSubmitButton ).grid (row=2,column=1, sticky =W)

#definitions - Label (11:50 mins)
Label(window, text="n Your string", bg="white", font="none 12 bold").grid(row=4,column=0,sticky=W) # using grid layout

# output textField - Text(12:40 mins)
outputTextField = Text(window, width=75, height=6, wrap=WORD, background="white",)
outputTextField.grid(row=4, column=1,sticky=W)  # grid position of textField



# run the main loop
window.mainloop()
 

Я пытался:

 outputTextField.insert.lower(END, userEnteredText)
 

но это не сработало. Есть какие-нибудь советы?

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

1. Для этого стоит, чтобы индекс с плавающей запятой 0.0 был строкой "1.0" . Строки подсчитываются, начиная с единицы, а индексы являются строками, а не числами с плавающей запятой.

Ответ №1:

Если вы это сделаете outputTextField.insert(END, userEnteredText.lower()) , то введенный текст будет преобразован в нижний регистр, а затем функция вставки будет работать должным образом, принимая строчную строку в качестве аргумента.

Ответ №2:

в большинстве случаев из этих строковых методов вам нужно знать, что вам нужно создать для него новую переменную.

 def onClickSubmitButton():                      # submit button event handler
        userEnteredText = textbox.get()       # get the enterd text from the Entry text box
        low = userEnteredText.lower()
        outputTextField.delete(0.0, END)        # (14:30 mins)delete all of the output field text contents
        outputTextField.insert(END, low)  # (15:50 mins) output the user eneterd text
 

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

1. Вам не нужна новая переменная, новая переменная, такая как в этом случае, была бы полезна, если бы ее часто использовали, так как она экономит много места и ее было бы легче читать, так как она похожа на 3 буквы против более чем 10, так что это довольно здорово, однако в этом случае это не обязательно, посмотрите на другой аналогичный ответ

2. На самом деле в этом конкретном случае вы могли бы просто использовать outputTextField.insert(END, textbox.get().lower()) , и это было бы в двух строках, хотя, вероятно, у этой переменной есть и другие применения ( userEnteredText переменная).

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

Ответ №3:

Итак, вот немного более необычный вариант (я не знаю, нужно ли вам что-то подобное, но он также делает то, что вы просите, за исключением того, что не нужно нажимать кнопку, чтобы изменить символы на строчные, в этом случае он будет делать это, когда пользователь печатает, попробуйте):

 from tkinter import Tk, Text


def lower_input(event):
    if not event.char or r'x' in repr(event.char):
        return
    text.delete('insert-1c')
    text.insert('insert', event.char.lower())


root = Tk()

text = Text(root)
text.pack()
text.bind('<Key>', lambda e: root.after(1, lower_input, e))

root.mainloop()
 

По сути, он просто привязывает "<Key>" событие к текстовому виджету, что означает, что при нажатии любой клавиши (и сосредоточении внимания на текстовом виджете) будет запущено событие, которое затем вызовет данную функцию. Также .bind проходит мероприятие аргумента, таким образом, должны быть обработаны даже если не используется, однако здесь он используется, чтобы определить характер или остановить функцию, если нажатая клавиша не имеет характера (например, «капс лок» или «Назад» (которая на самом деле есть байт штуку, так что почему существует также другая сравнение r"x" in repr(event.char) )). Затем он просто удаляет только что написанный символ и помещает на его место новый, написанный строчными буквами. Используется root.after , потому что событие вызывается до ввода символа в текстовый виджет, что означает, что используются неправильные индексы, поэтому существует небольшая задержка (1 мс), чтобы символ мог появиться на экране, а затем произойдет индексация.

РЕДАКТИРОВАТЬ: также можно добавить or event.char.islower() (если это не сработает, можно также попробовать or not event.char.isupper() ) к этому оператору if, чтобы немного повысить производительность, так как он не будет проходить процесс замены, если символ уже в нижнем регистре

ПРАВКА 2: в соответствии с PEP8 Вы должны использовать snake_case для именования переменных и функций, а НЕ camelCase

Полезные источники/документы: