我可以创建一个跨越文本小部件内多行的 Tkinter Canvas 吗?
Can I create a Tkinter Canvas that spans multiple lines inside a Text widget?
我想创建一个文本小部件,其中可以将 canvas 插入到文本中。我几乎已经完美了,但是我需要 canvas 来占用两行 space。我希望第一行 'Tom 24/11/2019' 与 canvas 的顶部对齐,第二行 'Hi Jim' 与 canvas 的底部对齐。我想做的事情有可能吗?
import tkinter as tk
sender='Tom'
dt='24/11/2019'
message='Hi Jim!'
root = tk.Tk()
text = tk.Text(root)
text.pack(padx = 10, pady = 10)
text.window_create(tk.END, window = tk.Canvas(root,bg='red',width=50,height=50)) # Example 2
text.tag_configure("sender", font="Arial 12 bold")
text.tag_configure("message", font="Arial 10",lmargin1=55,lmargin2=55)
text.tag_configure("date", font="Arial 8")
text.insert("end", sender.title()+' ',"sender")
text.insert("end", dt+'\n','date')
text.insert("end", message+'\n\n', 'message')
root.mainloop()
不,嵌入式小部件在文本小部件中不能跨越一行以上。
添加到 Text
的小部件 window_create()
有点像单个字符,您不能在其旁边添加多行文本。
这是一个解决方法(如果我理解您的需求)。它创建一个 Frame
来保存图像和 Text
小部件并将它们一个接一个地打包。这使得文本独立于图像,您可以将字符串放入其中,它们将与左边缘对齐。
让第二个字符串在底部右对齐是可能的,但我不知道有什么方法可以精确地做到这一点。在下面的代码中,我只是在两个字符串之间插入了一个空行,它恰好运行得很好 (IMO)。
import tkinter as tk
sender = 'Tom'
dt = '24/11/2019'
message = 'Hi Jim!'
root = tk.Tk()
frame = tk.Frame(root, bg='white', bd=0, highlightthickness=0)
frame.pack()
canvas = tk.Canvas(frame, bg='red', width=50, height=50)
canvas.pack(side=tk.LEFT, anchor=tk.NW)
text = tk.Text(frame, bd=0)
text.pack(side=tk.LEFT, anchor=tk.NW)
text.tag_configure("sender", font="Arial 12 bold")
text.tag_configure("message", font="Arial 10") # , lmargin1=55, lmargin2=55)
text.tag_configure("date", font="Arial 8")
text.insert("end", sender.title()+' ', "sender")
text.insert("end", dt+'\n', 'date')
text.insert("end", '\n') # Add a blank line to move next one down.
text.insert("end", message+'\n\n', 'message')
root.mainloop()
截图
我想创建一个文本小部件,其中可以将 canvas 插入到文本中。我几乎已经完美了,但是我需要 canvas 来占用两行 space。我希望第一行 'Tom 24/11/2019' 与 canvas 的顶部对齐,第二行 'Hi Jim' 与 canvas 的底部对齐。我想做的事情有可能吗?
import tkinter as tk
sender='Tom'
dt='24/11/2019'
message='Hi Jim!'
root = tk.Tk()
text = tk.Text(root)
text.pack(padx = 10, pady = 10)
text.window_create(tk.END, window = tk.Canvas(root,bg='red',width=50,height=50)) # Example 2
text.tag_configure("sender", font="Arial 12 bold")
text.tag_configure("message", font="Arial 10",lmargin1=55,lmargin2=55)
text.tag_configure("date", font="Arial 8")
text.insert("end", sender.title()+' ',"sender")
text.insert("end", dt+'\n','date')
text.insert("end", message+'\n\n', 'message')
root.mainloop()
不,嵌入式小部件在文本小部件中不能跨越一行以上。
添加到 Text
的小部件 window_create()
有点像单个字符,您不能在其旁边添加多行文本。
这是一个解决方法(如果我理解您的需求)。它创建一个 Frame
来保存图像和 Text
小部件并将它们一个接一个地打包。这使得文本独立于图像,您可以将字符串放入其中,它们将与左边缘对齐。
让第二个字符串在底部右对齐是可能的,但我不知道有什么方法可以精确地做到这一点。在下面的代码中,我只是在两个字符串之间插入了一个空行,它恰好运行得很好 (IMO)。
import tkinter as tk
sender = 'Tom'
dt = '24/11/2019'
message = 'Hi Jim!'
root = tk.Tk()
frame = tk.Frame(root, bg='white', bd=0, highlightthickness=0)
frame.pack()
canvas = tk.Canvas(frame, bg='red', width=50, height=50)
canvas.pack(side=tk.LEFT, anchor=tk.NW)
text = tk.Text(frame, bd=0)
text.pack(side=tk.LEFT, anchor=tk.NW)
text.tag_configure("sender", font="Arial 12 bold")
text.tag_configure("message", font="Arial 10") # , lmargin1=55, lmargin2=55)
text.tag_configure("date", font="Arial 8")
text.insert("end", sender.title()+' ', "sender")
text.insert("end", dt+'\n', 'date')
text.insert("end", '\n') # Add a blank line to move next one down.
text.insert("end", message+'\n\n', 'message')
root.mainloop()
截图