Центрирование позиций кнопок внутри сетки Tkinter - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь написать игру Connect 4 для своего проекта.Я использую tkinter без какого-либо предыдущего опыта.Я использую макет grid(), с 3 строками (1-й для заголовка, 2-й для кнопок и 3-й для холста, отображающего мою игру) и 6 столбцами.Проблема, с которой я столкнулся, заключается в том, чтобы кнопки появлялись вверху каждого столбца.Даже первая кнопка не находится в середине 1-го столбца, и она становится все больше и больше с каждой следующей кнопкой.Я думал, что столбцы будут одинаковой ширины, так как все они содержат одну и ту же кнопку.

P1 - это мой класс, в котором содержится фактическая игровая доска и количество строк / столбцов, которые я планирую сделатьизмените их.

Я пытался использовать grid_rowconfigure метод, подобный этому:

self.grid_rowconfigure(1, weight=1)

Но, похоже, это не имеет никакого эффекта.

#Main.py
class Game:
    def __init__(self, roows, coolumns):
        self.rows = roows
        self.columns = coolumns
        self.gameTable = [["x" for x in range(self.columns)] for y in range(self.rows)]
        self.which_row = [5 for x in range(self.columns)]
from tkinter import *
import Main

class Window(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master

        self.master.title("connect four")
        self.grid()

        Tytul = Label(self, text="Hello", font=("Helvetica", 24), fg="medium blue")
        Tytul.grid(row=0, columnspan=6)

        for i in range(P1.columns):
            button = Button(self, text="▼")
            button.grid(row=1, column=i)
        #self.grid_rowconfigure(1, weight=1)

    def draw_gametable(self):
        canvas1 = Canvas(self, relief=FLAT, background="#D2D2D2",
                         width=P1.columns*100, height=P1.rows*100)
        canvas1.grid(row=2, columnspan=6)

        cellwidth = 100
        cellheight = 100

        for column in range(P1.columns):
            for row in range(P1.rows):
                if P1.gameTable[row][column] == "x":
                    color = "grey"
                elif P1.gameTable[row][column] == "z":
                    color = "yellow"
                elif P1.gameTable[row][column] == "c":
                    color = "Red"
                x1 = column * cellwidth
                y1 = row * cellheight
                x2 = x1 + cellwidth
                y2 = y1 + cellheight
                canvas1.create_rectangle(x1, y1, x2, y2, fill="cornflower blue")
                canvas1.create_oval(x1 + 2, y1 + 2, x2 - 2, y2 - 2, fill=color,  
                                    tags="oval")

if __name__ == "__main__":
    P1 = Main.Game(6, 7)
    root = Tk()
    instance = Window(root)
    instance.draw_gametable()
    root.mainloop()

Вот как бы я хотел, чтобы это выглядело

1 Ответ

0 голосов
/ 11 апреля 2019

У вас есть семь столбцов, но вы делаете холст всего шесть. columnspan означает не «сколько больше столбцов для охвата», а скорее «сколько столбцов всего для охвата».

Если вы делаете так, чтобы холст охватывал все 7 столбцов, все выстроится в ряд:

canvas1.grid(row=2, columnspan=7)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...