Python / Tkinter: Using Tkinter languages ​​for RTL (from right to left) like Arabic / Hebrew?

Can I use Tkinter to display user interfaces for RTL languages ​​such as Arabic or Hebrew? I tried googling on "tkinter rtl" and the search results were disappointing. Tk wiki indicates that there is currently no bidi support.

Is anyone developing Tkinter apps for Arabic or Hebrew?

+6
python right-to-left localization tkinter
source share
3 answers

I understand this is an old question, but I just started working with Tkinter yesterday to develop a Hebrew application in Python. Right-to-left (bidi) is not available as part of the framework, but after a little Google search and some research, I managed to convincingly fake it using key bindings and force the cursor to move. The My Record widget keeps the excuse to the left, so that the Hebrew text is about the same as the English in the same field, but this approach can be easily changed for a legitimate window. (Or right excuse can make it easier). However, here is what I did.

Essentially, what you are doing here is forcing the cursor position using callbacks, character codes, and index constants. Also, you have to consider the arrow keys (mine behave like moving in the direction they are pointing. I always hated the way RTL usually changes the direction of the arrows. It's easy to change if you prefer otherwise). Backspace and Del should also cause some manual movement. Of course, if you track the cursor manually, you need to update your tracking variable in case the user resets it with the mouse. Below is my code, except that using global here is intended to remove a compound word from an explanation.

# Here, the necessary bindings. We're going to # have to make modifications on key press, release, # and on a completed mouse click. entryWidget.bind("<KeyPress>", rtlPress) entryWidget.bind("<KeyRelease>", rtlRelease) entryWidget.bind("<ButtonRelease>", rtlMouse) 

Next, there are three callback functions that perform all of our tracking and cursor movement.

 #With the following functions, keep in mind that we only want the cursor to move RIGHT #(increase in index) in response to a right arrow press or a DEL. Essentially, we are #compensating for any movement but these explicit conditions. Since the indexing of the #cursor position is LTR, holding it in its current position #while we append more text is #tantamount to moving it right. #On key release, if an arrow key has been invoked, we update our tracking variable to #reflect the new cursor position. If any other key was pressed, we snap the cursor back #to where it was prior to the keypress to prevent it from moving right and cause the #next letter to be appended on the left side of the previous letter. def rtlRelease(event): global hebCursorPos if event.keycode==114 or event.keycode==113: hebCursorPos=event.widget.index(INSERT) else: event.widget.icursor(hebCursorPos) print(str(event.keycode)+" "+str(hebCursorPos)) #On keypress, we must compensate for the natural LTR behavior of backspace(22) and #del(119) def rtlPress(event): global hebCursorPos #In LTR text entry, a backspace naturally removes the character to the left of #the cursor. if event.keycode==22: length = len(event.widget.get()) #In RTL, the right edge is the beginning of the string, so backspace #should do nothing. #If we're at the right edge of the string, we insert a meaningless #character to be deleted so that it appears to the user as if we have #done nothing. if hebCursorPos==length: event.widget.insert(hebCursorPos, " ") #In order to cause the backspace to delete the character to the right #rather than the left of the cursor from the user perspective, we step #the cursor forward one. This will cause the backspace to delete the #character to the left of the new cursor position, which will be the #character that was to the right of the cursor from the user #perspective. If we were at the right end of the line, we insert a space #and delete it milliseconds later. We do not need to update the cursor #position, in the tracking variable, because after the character is #deleted, it is back at the index from which it started, counting index #from an LTR perspective. event.widget.icursor(hebCursorPos+1) else: #Del is more of the same. It deletes the character to the right of the #cursor, but we want it to delete the character to the right. if event.keycode==119: #If we're at the left edge of the string, insert a meaningless character #for the del to delete, so that from the user perspective it does #nothing. if hebCursorPos==0: event.widget.insert(hebCursorPos, " ") #Otherwise, we will be stepping the cursor one to the left, so #that when it deletes the character to its new right, it will be #deleting the character from what the user thinks is its left. #Because we are deleting a character from the left of the cursor #from the user perspective, there will be fewer characters to #the left of the cursor once the operation is complete. As #cursor positioning is tracked as an LTR index, we must update #our tracking variable. else: hebCursorPos-=1 #Now, we snap our cursor to the position of our tracking variable. #Either we are preventing it from drifting right due to overlapping #keypresses, or we are repositioning it to maintain the correct index #after a del. event.widget.icursor(hebCursorPos) #Simply put, if the user repositions the cursor with the mouse, track it. def rtlMouse(event): global hebCursorPos hebCursorPos=event.widget.index(INSERT) 

Hope this helps! Since this is achieved by forcefully moving the cursor, there is a slight visual jitter of the cursor during input, but the ordering of the text seems correct, and the cursor seems to always indicate the correct position when the user does not press the middle key. I make no complaints about code excellence, though!

+3
source share

this may also not solve the whole problem, but it can solve the mapping problem, which I see the main problem.

basically, you will need two things to reverse the order of the characters and allow them to combine. I used this reshaper , it worked fine with simple words without the Ψ§Ω„Ψ­Ψ±ΩƒΨ§Ψͺ , but in some cases it is still faulty.

0
source share

Try setting the entry element or another element to "jameel noori nastaleeq" or any other urdu font

0
source share

All Articles