我可以在文本小部件内创建跨多行的Tkinter画布吗?

时间:2019-11-24 20:45:47

标签: python canvas tkinter text tk

我想创建一个文本小部件,在其中可以将画布插入文本。我几乎完美了,但是我需要画布占用两行空间。我希望第一行“ Tom 24/11/2019”与画布的顶部对齐,第二行“ Hi Jim”与画布的底部对齐。我想做的事有可能吗?

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()

2 个答案:

答案 0 :(得分:1)

否,嵌入式窗口小部件在文本窗口小部件中不能跨越多行。

答案 1 :(得分:1)

window_create()添加到Text的小部件有点像单个字符,并且您不能在其旁边的多行上添加文本。

这是一种解决方法(如果我了解您的需求)。它创建一个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()

屏幕截图

screenshot showing text lined up next to image