Python 我可以在一个文本小部件中创建一个跨越多行的Tkinter画布吗?

Python 我可以在一个文本小部件中创建一个跨越多行的Tkinter画布吗?,python,canvas,tkinter,text,tk,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) tex

我想创建一个文本小部件,在其中可以将画布插入文本。我几乎做到了完美,但是我需要画布占据两行空间。我希望第一行“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()

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

小部件添加到文本中的
窗口创建()

这里有一个解决办法(如果我理解你想要什么)。它创建一个
框架
来保存图像和
文本
小部件,并将它们彼此相邻地打包。这使得文本独立于图像,您可以将字符串放入其中,它们将与左边缘对齐

让第二个字符串在底部对齐可能是可能的,但我不知道如何立即精确对齐。在下面的代码中,我只是在两个字符串之间插入了一个空行,结果正好很好(IMO)

截图


也许你应该在画布中放置文本,不是画布内部的文本。谢谢,但这是一个巨大的项目,我有很多内存问题,这样做,如果我想更新文本元素,那么我将不得不运行数千个事件来更新每个元素,但外部有一个文本,我只需对文本运行更新功能。坦率地说,我不明白你想做什么。也许你应该按以下顺序排列:第一个文本,画布,下一个文本。嗨,谢谢,这是一个很好的解决方案!我看到的唯一问题是,例如,如果我有20个这样的对象在彼此下面,那么同时滚动文本小部件和画布有多容易。我认为可以将红色图像和
文本
小部件嵌套在外部
画布
(而不是
框架
)中,然后滚动它。因为它们都是它的一部分,所以当外部
画布
被滚动时,它们都会一起滚动。希望这是有道理的。更多信息,请参见问题和@Bryan Oakley的答案。
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()