Получение сообщения об ошибке, если язык не персидский

Я использую библиотеку tkinter для написания формы на Python.

Я хочу, чтобы пользователь получил это сообщение:

"пожалуйста, используйте персидский язык"

если они начнут заполнять поля «نام» и «نام خانوادگی» на английском языке.

на самом деле у меня есть функция JavaScript, но я не знаю, как ее кодировать на Python с помощью tkinter

это функция для JavaScript:

<script>
function text(name)
{
    var name = $(name).val();
    if (name.length > 0) {
        just_persian(name);
    }
}

 function just_persian(str) {
    var p = /^[\u0600-\u06FF\s]+$/;
    if (!p.test(str)) {
        alert("please use Persian language");
    }
}
</script>

и вот код, который я использовал в Python с tkinter

from tkinter import *

root = Tk()

left_frame = Frame(root)
left_frame.grid(column=0)

label3 = Label(left_frame, text = "ورود به سامانه", width=15)
label3.grid(row=0, column=0,columnspan=2, sticky=W + E + N + S)

label1 = Label(left_frame, text = "شناسه کاربری", width=15)
label1.grid(row=1, column=1, sticky=W)

e1 = Entry(left_frame, width=15)
e1.grid(row=1, column=0,padx=5, pady=5)

label2 = Label(left_frame, text = "رمز عبور", width=15)
label2.grid(row=2, column=1, sticky=W)

e2 = Entry(left_frame, width=15)
e2.grid(row=2, column=0,padx=5, pady=5)

button1=Button(left_frame,width=10, text = "ورود")
button1.grid(row=3, column=0,sticky=W,pady=5,padx=5)

label4 = Label(left_frame, text = "ثبت نام", width=15)
label4.grid(row=0, column=3,columnspan=2, sticky=W + E + N + S)

label5 = Label(left_frame, text = "نام ", width=15)
label5.grid(row=1, column=4)

e3 = Entry(left_frame, width=15)
e3.grid(row=1, column=3,padx=5, pady=5)

label6 = Label(left_frame, text = "نام خانوادگی ", width=15)
label6.grid(row=2, column=4)

e4 = Entry(left_frame, width=15)
e4.grid(row=2, column=3,padx=5, pady=5)

label7 = Label(left_frame, text = "شماره دانشجویی ", width=15)
label7.grid(row=3, column=4)

e5 = Entry(left_frame, width=15)
e5.grid(row=3, column=3,padx=5, pady=5)

label8 = Label(left_frame, text = "شناسه کاربری ", width=15)
label8.grid(row=4, column=4)

e6 = Entry(left_frame, width=15)
e6.grid(row=4, column=3,padx=5, pady=5)

label9 = Label(left_frame, text = "رمز عبور ", width=15)
label9.grid(row=5, column=4)

e7 = Entry(left_frame, width=15)
e7.grid(row=5, column=3,padx=5, pady=5)

label10 = Label(left_frame, text = "تکرار رمز عبور ", width=15)
label10.grid(row=6, column=4)

e8 = Entry(left_frame, width=15)
e8.grid(row=6, column=3,padx=5, pady=5)

label11 = Label(left_frame, text = "رایانامه ", width=15)
label11.grid(row=7, column=4)

e9 = Entry(left_frame, width=15)
e9.grid(row=7, column=3,padx=5, pady=5)

label12 = Label(left_frame, text = "سال ورود ", width=15)
label12.grid(row=8, column=4)

e10 = Entry(left_frame, width=15)
e10.grid(row=8, column=3,padx=5, pady=5)

label13 = Label(left_frame, text = "استاد راهنما",width=15)
label13.grid(row=9, column=4)

OPTIONS = ["x", "y","z","w","v"]
variable = StringVar(root)
variable.set(OPTIONS[0])  # default value

w = OptionMenu(left_frame, variable, *OPTIONS)
w.grid(row=9,column=3,padx=5, pady=5)

button2=Button(left_frame,width=10, text = "ثبت")
button2.grid(row=10, column=3,sticky=W,pady=5,padx=5)

button3=Button(left_frame,width=10, text = "معتبر؟")
button3.grid(row=4, column=2,sticky=W,pady=5,padx=5)


root.mainloop()

Вы можете использовать то же регулярное выражение, просто переписав его на допустимый Python. Например, r'^[\u0600-\u06FF\s]+$'. Но каков ваш настоящий вопрос? Вам нужно знать, как указать вашим виджетам Entry вызывать Python-версию функции just_persian?

PM 2Ring 01.05.2018 17:36

Кстати, было бы легче помочь вам, если бы вы сократили этот код до минимальный воспроизводимый пример. Нам действительно не нужно видеть все эти виджеты.

PM 2Ring 01.05.2018 17:37

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

ehsun 01.05.2018 18:11

вот как я вызываю функцию в своем коде JavaScript: <input type = "text" name = "fname" style = "direction: rtl;" onkeyup = "text (this)" value = "" required = "required">

ehsun 01.05.2018 18:13

Взгляните на Добавление проверки в виджет входа.

PM 2Ring 01.05.2018 18:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
64
1

Ответы 1

Это было бы идеальным местом для создания собственного крошечного подкласса. Существует встроенный протокол проверки tkinter, но мне намного проще просто отследить переменную:

import tkinter as tk
from tkinter.messagebox import showerror

ALLOWED_ASCII = " " # spaces are not "persian" but they are allowed
class Ehsun(tk.Entry):
    '''A type of Entry that only accepts Persion input'''
    def __init__(self, master=None, **kwargs):
        self.var = tk.StringVar()
        self.old = ''
        tk.Entry.__init__(self, master, textvariable=self.var, **kwargs)
        self.var.trace('w', self.check)

    def check(self, *args):
        new_value = self.var.get()
        if all(0x0600 <= ord(char) <= 0x06FF for char in new_value if char not in ALLOWED_ASCII):
            self.old = new_value # all characters are Persian; ok to continue
        else:
            showerror("Errror", "please use Persian language")
            self.var.set(self.old) # disallow, reset Entry to old value

Как видите, я думаю, что re тоже излишне; просто используйте vanilla python, чтобы проверить диапазон ord.

Теперь просто замените Entry на Ehsun во всех местах, где вы хотите, чтобы запись была только персидской:

e1 = Ehsun(left_frame, width=15)
e1.grid(row=1, column=0,padx=5, pady=5)

спасибо большое, это действительно помогло

ehsun 01.05.2018 18:34

Другие вопросы по теме