【问题标题】:canvas not showing text画布不显示文字
【发布时间】:2018-11-26 09:39:41
【问题描述】:

我的画布显示了一个随机变化颜色的矩形网格,但是当我希望它结束​​时,它没有显示“再见!”我添加到画布的消息。这是为什么呢?

即使我在 __init__ 内注释行 for i in ...(即首先创建矩形的 for 循环),我也看不到文本。

文本更新是在“更新”函数开始时完成的,在最大迭代之后。

当更改为 self.canvas.create_text(100,100, text="Bye Bye!") 时,它似乎确实有效...但仅当没有显示矩形时

import tkinter as tk
from time import sleep
import random 


class GUI:
    def __init__(self, rows = 10, cols = 10, iteration_timer = 1):        

        self.canv_w = 300
        self.canv_h = 300
        self.cell_w = self.canv_w // cols
        self.cell_h = self.canv_h // rows

        self.master = tk.Tk()
        self.canvas = tk.Canvas(self.master, width = self.canv_w, height = self.canv_h)       
        self.canvas.pack()

        self.rect_dict          = {}
        self.iteration_timer    = iteration_timer
        self.iterations         = 0
        self.MAX_ITER           = 10

        for r in range(rows):
            for c in range(cols):
                self.rect_dict[(r*self.cell_h, c*self.cell_w)]  = self.canvas.create_rectangle(r    *self.cell_h, c    *self.cell_w,
                                                                                               (1+r)*self.cell_h, (1+c)*self.cell_w,
                                                                                               fill="blue")

        self.master.after(iteration_timer, self.update)
        tk.mainloop()



    def update(self):
        if self.iterations >= self.MAX_ITER:
            self.canvas.create_text(0,0,fill="darkblue", font="Times 100 italic bold", text="Bye Bye!")
            sleep(2)
            self.canvas.delete(tk.ALL)
            self.master.destroy()
            return

        self.iterations += 1

        for k in self.rect_dict:
            r = self.rect_dict[k]
            c = random.choice(['yellow', 'red', 'black', 'blue' , 'white'])
            self.canvas.itemconfig(r, fill=c)


        # call again
        self.master.after(self.iteration_timer, self.update)



def main():
    gui = GUI(rows = 20, cols = 20)


if __name__ == "__main__":
    main()

【问题讨论】:

    标签: python python-3.x canvas tkinter


    【解决方案1】:

    当您使用time.sleep 时,包括 Tkinter 主循环在内的所有内容都会停止。 Tkinter 主循环负责更新 UI,因此只要您不返回主循环,除非您手动更新,否则您不会看到 UI 的任何更新。因为您在 sleep 之后立即销毁 UI,所以您永远不会看到带有文本的更新后的 UI。

    基本上你可以做两件事,要么在调用sleep 之前手动更新,要么将sleep 调用更改为after,这将返回到主循环并安排你传递给它的函数。

    要手动更新,请在 sleep 之前调用 self.master.update()

    要将sleep 替换为after,只需更改

    sleep(2)
    self.canvas.delete(tk.ALL)
    self.master.destroy()
    

    self.master.after(2000, self.master.destroy)
    

    【讨论】:

    • 另一个问题 - 你知道我怎样才能使画布(除了文本)半透明吗?
    • 我不认为你可以在画布项目上做透明度。最接近的是stipple。如果将tags='rect' 添加到矩形创建中,则可以使用self.canvas.itemconfig('rect', stipple='gray50') 一次为所有矩形设置点画图案。您可以找到点画选项(即位图图像)here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2014-05-10
    • 2019-04-04
    • 2016-09-09
    • 2014-08-16
    • 2014-12-16
    相关资源
    最近更新 更多