【问题标题】:tkinter: displaying a square gridtkinter:显示方形网格
【发布时间】:2011-06-14 10:47:26
【问题描述】:

我正在尝试使用 tkinter 定期刷新方形网格。网格中的每个正方形都涂有某种颜色(例如从给定函数获得);在每个正方形的中心,绘制了一个较小的圆圈(颜色也是从函数中获取的)。

如果我必须从头开始,也许我可以使用一个示例或标准食谱?

【问题讨论】:

  • 您是否在绘制带圆圈的网格或刷新网格时遇到问题?
  • @martineau:我在以简洁的方式绘图时遇到问题。我想我误解了 tkinter 应该如何使用。我认为刷新不会有问题,但我还没有解决。

标签: user-interface python-3.x tkinter


【解决方案1】:

这里有一个快速技巧,展示了如何绘制矩形和圆形网格,以及如何每秒更新一次显示。如果您以前从未在 tk 中编程,那么它使用的概念对您来说无疑是陌生的。您需要阅读画布对象 ID 和标签,以及 after 命令的作用。

import Tkinter as tk
import random

class App(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.canvas = tk.Canvas(self, width=500, height=500, borderwidth=0, highlightthickness=0)
        self.canvas.pack(side="top", fill="both", expand="true")
        self.rows = 100
        self.columns = 100
        self.cellwidth = 25
        self.cellheight = 25

        self.rect = {}
        self.oval = {}
        for column in range(20):
            for row in range(20):
                x1 = column*self.cellwidth
                y1 = row * self.cellheight
                x2 = x1 + self.cellwidth
                y2 = y1 + self.cellheight
                self.rect[row,column] = self.canvas.create_rectangle(x1,y1,x2,y2, fill="blue", tags="rect")
                self.oval[row,column] = self.canvas.create_oval(x1+2,y1+2,x2-2,y2-2, fill="blue", tags="oval")

        self.redraw(1000)

    def redraw(self, delay):
        self.canvas.itemconfig("rect", fill="blue")
        self.canvas.itemconfig("oval", fill="blue")
        for i in range(10):
            row = random.randint(0,19)
            col = random.randint(0,19)
            item_id = self.oval[row,col]
            self.canvas.itemconfig(item_id, fill="green")
        self.after(delay, lambda: self.redraw(delay))

if __name__ == "__main__":
    app = App()
    app.mainloop()

【讨论】:

  • 谢谢!是否有完整的 tkinter 文档?比如我知道create_oval在指定的边界矩形内创建了一个椭圆,但是我在任何地方都找不到这个函数的官方描述。
  • @max: tkinter 最好的在线资源之一是effbot.org/tkinterbook Tkinter 只是 tk 的一个 python 包装器。 tk 的最终文档是tcl.tk/man/tcl8.5/TkCmd/contents.htm,但它假定您使用的是 Tcl 而不是 python。将 tcl 代码翻译成 python 只是一个小的心理障碍。从 efbot 文档开始,如果您需要更多细节,请阅读 tcl 文档。
  • 我可以从App.__init__ 方法内部而不是从外部调用self.mainloop() 吗?
  • @max:我建议你试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
相关资源
最近更新 更多