简体   繁体   中英

Building a chessboard with buttons, which is always a square

I'm trying to build a chessboard consisting of buttons. I created 3 widgets in one line. There are labels outside (filling) and inside I want to put a chessboard. I would like it to always occupy 90% of the screen width and automatically adjust its height so that it always remains a square. It would also be necessary to set the buttons always to be squares but I also can't handle it. Can You help me?

class ChessBoard(GridLayout):
    def __init__(self, **kwargs):
        super(ChessBoard, self).__init__(**kwargs)
        self.cols = 8

        for i in range(64):
            self.cell = Button(text="", size_hint_y=self.height/8, height=self.width/8)
            self.add_widget(self.cell)

class ChessBoardContainer(GridLayout):
    def __init__(self, **kwargs):
        super(ChessBoardContainer, self).__init__(**kwargs)

        self.orientation='horizontal'
        self.cols=3

        self.lab1 = Label(text="1")
        self.add_widget(self.lab1)

        self.board = ChessBoard()
        self.add_widget(self.board)

        self.lab2 = Label(text="2")
        self.add_widget(self.lab2)


class CombWidget(BoxLayout):
    def __init__(self, **kwargs):
        super(CombWidget, self).__init__(**kwargs)
        self.orientation='vertical'

        self.but1 = Button(text="But1", font_size=40)
        self.add_widget(self.but1)

        self.chessb = ChessBoardContainer()
        self.add_widget(self.chessb)

        self.but2 = Button(text="But2", font_size=40)
        self.add_widget(self.but2)


class MyPaintApp(App):
    def build(self):
        return CombWidget()

Right now this is my result:

在此处输入图片说明

I would like to get something like this (Paint master ;) ). Maybe it could be done without this labels?

在此处输入图片说明

To make buttons be squares you just have to set the height and width of GridLayout cells, and you are trying to do it with size_hint. Try this:

from kivy.core.window import Window

class ChessBoard(GridLayout):
    def __init__(self, **kwargs):
        super(ChessBoard, self).__init__(**kwargs)
        self.cols = 8
        winsize = Window.size
        sizedict = {}

        # to set width and height of GridLayout cells, you should make a dict, where the key is col's/row's number and the value is size
        for i in range(self.cols):
            sizedict[i] = winsize[0]/8 #or you can divide it by 10 for example to have some black filling on the sides

        # and then simply do this
        self.cols_minimum = sizedict
        self.rows_minimum = sizedict

This code produces buttons that look fairly square to me. If you plan to use images for your chess pieces, the buttons will conform to the size of those.

from tkinter import Tk, Button

window = Tk ()
squares = []
index = 0
for x in range (8) :
    for y in range (8) :
        squares.append (Button (window, width = 7, height = 4))
        squares [index].grid (row = x, column = y)
        index += 1
window.mainloop ()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM