tkinter 画布文本输出

Posted

技术标签:

【中文标题】tkinter 画布文本输出【英文标题】:tkinter canvas text output 【发布时间】:2019-06-07 10:53:42 【问题描述】:

我一直在查看我的代码,并且对 tkinter 很陌生。我的代码的目的是在 Canvas 小部件中显示文本,而不是覆盖标签。但不确定如何执行此操作:

我的代码如下:

from tkinter import *

class Example(Frame):

    def printLabel(self):
        self.hello = []
        self.hello.append('Hello')
        self.hello.append('World!')
        return(self.hello)

    def updatePanel(self):
        self.panelA.config(text="".format(self.printLabel()))

    def __init__(self, root):
        Frame.__init__(self, root)
        self.buttonA()
        self.viewingPanel()

    def buttonA(self):
        self.firstPage = Button(self, text="Print Text", bd=1, anchor=CENTER, height = 11, width = 13, command=lambda: self.updatePanel())
        self.firstPage.place(x=0, y=0)

    def viewingPanel(self):
        self.panelA = Label(self, bg='white', width=65, height=13, padx=3, pady=3, anchor=NW, text="")
        self.panelA.place(x=100, y=0)
        self.cl= Canvas(self.panelA,bg='WHITE',width=165,height=113,relief=SUNKEN)
        canvas_id = self.cl.create_text(15, 15, anchor="nw")

        self.xb= Scrollbar(self.panelA,orient="horizontal", command=self.cl.xview)
        self.xb.pack(side=BOTTOM,fill=X)
        self.xb.config(command=self.cl.xview)
        self.yb= Scrollbar(self.panelA,orient="vertical", command=self.cl.yview)
        self.yb.pack(side=RIGHT,fill=Y)
        self.yb.config(command=self.cl.yview)

        self.cl.itemconfig(canvas_id,font=('Consolas',9), text="".format(self.printLabel()))
        self.cl.configure(scrollregion = self.cl.bbox("all"))
        self.cl.config(xscrollcommand=self.xb.set, yscrollcommand=self.yb.set)
        self.cl.config(width=250,height=150)
        self.cl.pack(side=LEFT,expand=True,fill=BOTH)

def main():
    root = Tk()
    root.title("Tk")
    root.geometry('378x176')
    app = Example(root)
    app.pack(expand=True, fill=BOTH)
    root.mainloop()

if __name__ == '__main__':
    main()

Hello World! 应该在Canvas 中不带括号显示,但主要问题是当我单击Button 时,它只会与画布重叠并打印出附加到Label

Label 应该在 Canvas 内。

【问题讨论】:

self.hello 是一个列表,打印为一个列表。将其更改为" ".join(self.hello)。但是你为什么首先将它构建为一个列表呢?你想做self.hello=""; self.hello += 'Hello'吗? 括号正在打印,因为printLabel() 方法返回list。您可以通过将其最后一行更改为 return(' '.join(self.hello)) 来摆脱它们。 我不太明白你所说的“主要问题”是什么。当Button被按下时你想发生什么? 当我执行 GUI 时,文本出现而不单击 ButtonA,但是当单击 ButtonA 时,Hello World 文本显示为画布上的标签。我想要实现的是一个 GUI,它仅在单击 ButtonA 时才在画布中显示文本,即 Hello World!从我的角度来看,我添加了一个标签,然后将标签嵌入到画布中,因此当单击按钮时,它看起来就像文本出现在标签上。我正在努力实现这一目标,请对此有任何建议吗? GUI 已执行 > 不应有文本 > 单击 ButtonA > Hello World! > 文本应该出现在画布中,而不是重叠的标签中。问题 = 点击前出现文本,点击按钮时出现在标签上 【参考方案1】:

以下是解决“主要问题”和“括号问题”的方法。后者通过使用 cmets 中建议的字符串 join() 方法来处理。

updatePanel() 方法已被修改,因此它首先创建一个带有您要在其中显示的文本的 Label 小部件,然后是一个 Canvas“窗口”对象,将该小部件指定为其内容。您尝试执行此操作的方式的代码也已从其他类方法中删除。

from tkinter import *


class Example(Frame):

    def __init__(self, root):
        Frame.__init__(self, root)
        self.buttonA()
        self.viewingPanel()

    def printLabel(self):
        text = []
        text.append('Hello')
        text.append('World!')
        return ' '.join(text)

    def updatePanel(self):
        label = Label(self, bg='white', padx=3, pady=3, anchor=NW,
                      text=self.printLabel())
        label.place(relx=0.5, rely=0.5, anchor=CENTER)
        self.cl.create_window(100, 100, window=label)  # Put Label in a Canvas "window".

    def buttonA(self):
        self.firstPage = Button(self, text="Print Text", bd=1, anchor=CENTER, height=11,
                                width=13, command=lambda: self.updatePanel())
        self.firstPage.place(x=0, y=0)

    def viewingPanel(self):
        self.panelA = Label(self, bg='white', width=65, height=13, padx=3, pady=3,
                            anchor=NW, text="")
        self.panelA.place(x=100, y=0)
        self.cl= Canvas(self.panelA, bg='WHITE', width=165, height=113, relief=SUNKEN)
        canvas_id = self.cl.create_text(15, 15, anchor="nw")

        self.xb= Scrollbar(self.panelA,orient="horizontal", command=self.cl.xview)
        self.xb.pack(side=BOTTOM, fill=X)
        self.xb.config(command=self.cl.xview)
        self.yb= Scrollbar(self.panelA, orient="vertical", command=self.cl.yview)
        self.yb.pack(side=RIGHT, fill=Y)
        self.yb.config(command=self.cl.yview)

        self.cl.itemconfig(canvas_id, font=('Consolas',9), text=self.printLabel())
        self.cl.configure(scrollregion=self.cl.bbox("all"))
        self.cl.config(xscrollcommand=self.xb.set, yscrollcommand=self.yb.set)
        self.cl.config(width=250, height=150)
        self.cl.pack(side=LEFT, expand=True, fill=BOTH)


def main():
    root = Tk()
    root.title("Tk")
    root.geometry('378x176')
    app = Example(root)
    app.pack(expand=True, fill=BOTH)
    root.mainloop()

if __name__ == '__main__':
    main()

【讨论】:

我注意到如果我更换 Hello World!用更长的句子按钮显示窗口仍然在画布之外并且没有将标签放在画布中。如果您将文本保留在viewingPanel 方法中,则输出很好,但是当单击按钮时,文本仍然出现在画布之外,这是有原因的还是可以更改? 如果将文本 obj 的长度超过 Label 的宽度,就会发生在同样太小的 Canvas 窗口对象中。你基本上是在要求它做不可能的事情。你需要把Canvas 变大。

以上是关于tkinter 画布文本输出的主要内容,如果未能解决你的问题,请参考以下文章

tkinter - 加权画布不填充空白空间

Python Tkinter - 保存画布 - tkinter 崩溃

tkinter的控件

Tkinter 组件

tkinter:在画布上使用滚动条

为啥我的 Tkinter 画布显示?