【问题标题】:Is there a way to centre a canvas widget in the window?有没有办法在窗口中居中画布小部件?
【发布时间】:2019-06-20 04:58:42
【问题描述】:

我正在使用 Tkinker/Python 构建一个国际象棋程序。我正在尝试将板对齐在窗口的中心,这样我就可以将所取的部分放在板旁边。有什么想法吗?

from tkinter import *
root=Tk()

class Board():  
    def drawboard():


        dark="#643c22"
        light="#faeac6"

        canvas=Canvas(root, width=920, height=720,)
        canvas.pack( fill=BOTH)
        colour=light
        for row in range(8):
            if colour==dark:
                colour=light
            else:
               colour=dark 
            for column in range(8):
                x1 = (column * 90)
                y1 = ((7-row)* 90)
                x2 = x1 + 90
                y2 = y1 + 90
                canvas.create_rectangle(x1, y1, x2, y2, fill=colour)

                if colour==dark:
                    colour=light
                else:
                    colour=dark


Board.drawboard()


root.mainloop()

我希望它在中心排列,但它在左侧对齐。

【问题讨论】:

  • 只需将偏移量添加到x1。对于您的情况,偏移量为(920 - 8*90) // 2 = 100。因此,x1 = (column * 90) + 100.

标签: python python-3.x tkinter tkinter-canvas


【解决方案1】:

您创建的类只是一些函数的容器...您可能需要阅读一些有关面向对象的 python 的知识,并熟悉它的细节。我重写了你的课程Board作为例子;它继承自 tk.Tk,因此是 tkinter root

就各种小部件的放置而言,我添加了一个左右框架,以使代表棋盘的画布居中。

它是这样的:

import tkinter as tk


class Board(tk.Tk):

    colours = ["#643c22", "#faeac6"]

    def __init__(self, n=8):
        super().__init__()
        self.n = n
        self.left_frame = tk.Frame(self)
        self.left_frame.grid(row=0, column=0, rowspan=8, padx=100)
        self.right_frame = tk.Frame(self)
        self.right_frame.grid(row=0, column=10, rowspan=8)
        self.canvas = tk.Canvas(self, width=920, height=720, )
        self.canvas.grid(row=0, column=1, columnspan=8, rowspan=8)
        self.board = [[None for row in range(n)] for col in range(n)]
        self.current_colour_ndx = 0

    def _swap_colours(self):
        self.current_colour_ndx = (self.current_colour_ndx + 1) % 2

    def drawboard(self):

        for col in range(self.n):
            self._swap_colours()
            for row in range(self.n):
                x1 = col * 90
                y1 = (7-row) * 90
                x2 = x1 + 90
                y2 = y1 + 90
                colour = self.colours[self.current_colour_ndx]
                self.board[row][col] = self.canvas.create_rectangle(x1, y1, x2, y2, fill=colour)
                self._swap_colours()


if __name__ == '__main__':

    board = Board()
    board.drawboard()
    board.mainloop()

【讨论】:

  • 谢谢你是对的,我现在提高了我的课程知识。我的一个问题是 ndx 是什么?比如在交换颜色功能中?
  • self.current_colour_ndx 是类变量Board.colourslist)的索引,它允许以棋盘格图案交替颜色。它采用值zeroone。如果你盯着它看足够长的时间,你就会知道它是如何计算的。
猜你喜欢
  • 2013-02-13
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多