私はあなたがこのようなものが欲しいと思いますか?
これが今のところ入手できる最も近いものです。3 つのテキスト ボックスを作成し、anchor
属性を使用してそれらを適切な場所に配置します。ただし、非常に広い文字や狭い文字にはあまり適していません。完璧ではありませんが、最初の一歩になるかもしれません。
import Tkinter as tk
root = tk.Tk()
c = tk.Canvas(root)
c.pack(expand=1, fill=tk.BOTH)
words = '''I am writing a program that involves displaying some text in a create_text() box on a Tkinter canvas, within a loop. Each word is displayed, then replaced by the next. Sort of like flash cards. I need to color one letter of each word, close to the middle of the word, so that when the user is reading the words their eyes focus on the middle of the word. So if len(i)=1, color i[0], if len(i)>= 2 and <= 5, color i[1], and so on. It needs to be done using the Canvas, and using canvas.create_text(text = i[focus_index],fill = 'red') The result should print like this exaMple (but obviously "m" would be colored red, not be uppercase)'''
words = words.split()
def new_word(i):
if i == len(words):
i = 0
word = words[i]
middle = (len(word)+1)//2
c.itemconfigure(t1, text=word[:middle-1]+' ')
c.itemconfigure(t2, text=word[middle-1:middle])
c.itemconfigure(t3, text=word[middle:])
root.after(100, lambda: new_word(i+1))
t1 = c.create_text(200,100,text='', anchor='e', font=("Courier", 25))
t2 = c.create_text(200,100,text='', anchor='e', font=("Courier", 25), fill='red')
t3 = c.create_text(200,100,text='', anchor='w', font=("Courier", 25))
new_word(0)
root.geometry('400x200+200+200')
root.mainloop()
OK、 Bryan Oakley のコメントからのリンクを使用して、コードをさらに改善して、等幅フォントだけでなく、任意のフォントで動作するようにしました。このコードは、色付きの文字の中心を同じ場所に保ち、単語の前後を正しい距離に配置します。
import Tkinter as tk
import tkFont
root = tk.Tk()
c = tk.Canvas(root)
c.pack(expand=1, fill=tk.BOTH)
fn = "Helvetica"
fs = 24
font = tkFont.Font(family=fn, size=fs)
words = '''I am writing a program that involves displaying some text in a create_text() box on a Tkinter canvas, within a loop. Each word is displayed, then replaced by the next. Sort of like flash cards. I need to color one letter of each word, close to the middle of the word, so that when the user is reading the words their eyes focus on the middle of the word. So if len(i)=1, color i[0], if len(i)>= 2 and <= 5, color i[1], and so on. It needs to be done using the Canvas, and using canvas.create_text(text = i[focus_index],fill = 'red') The result should print like this exaMple (but obviously "m" would be colored red, not be uppercase)'''
words = words.split()
def new_word(i):
if i == len(words):
i = 0
word = words[i]
middle = (len(word)+1)//2
front = word[:middle-1]
letter = word[middle-1:middle]
back = word[middle:]
c.itemconfigure(t1, text=front)
c.itemconfigure(t2, text=letter)
c.itemconfigure(t3, text=back)
c.coords(t1, 200-font.measure(letter)/2, 100)
c.coords(t3, 200+font.measure(letter)/2, 100)
root.after(100, lambda: new_word(i+1))
t1 = c.create_text(200,100,text='', anchor='e', font=font)
t2 = c.create_text(200,100,text='', anchor='c', font=font, fill='red')
t3 = c.create_text(200,100,text='', anchor='w', font=font)
new_word(0)
root.geometry('400x200+200+200')
root.mainloop()