Tkinter создать несколько кнопок в рамке - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь создать графический интерфейс с использованием Pkinter.Мне нужно сделать много кнопок, и прямо сейчас я создал около 50 кнопок, покрывающих весь экран (расширяет и заполняет).Я пытаюсь поместить эти кнопки в рамку, чтобы можно было добавить больше рамок сбоку.Я видел другие посты, в которых предлагалось использовать Grid, но я не мог понять, как расположить кнопки 60 без опции Grid.

Вот мой код.

def create_buttons(self):
    Grid.rowconfigure(self.root, 0, weight=1)
    Grid.columnconfigure(self.root, 0, weight=1)
    card_frame = Frame(self.root)
    card_frame.grid(row=0, column=0, sticky=N+S+E+W)
    # Create a 5x10 (rows x columns) grid of buttons inside the frame
    i = 0
    for row_index in range(5):
        Grid.rowconfigure(card_frame, row_index, weight=1)
        for col_index in range(10):
            # Set card image
            card_image_path = "assets/Card_Orange_gif/" + str(i) + ".gif"
            card_image = PhotoImage(file=card_image_path)
            small_card_image = card_image.subsample(2, 2)
            # Create button
            Grid.columnconfigure(card_frame, col_index, weight=1)
            btn = Button(card_frame,
                         width=5, height=5,
                         image=small_card_image,
                         bg="azure",
                         borderwidth=0,
                         command=lambda i = i: self.card_button_clicked(i))
            btn.image = small_card_image
            btn.grid(row=row_index, column=col_index, sticky=N+S+E+W)

            i = i+1
}

Вот мойидеальный результат.(не могу добавить фото, вот ссылка) https://paste.pics/46XES

1 Ответ

0 голосов
/ 25 ноября 2018

Вы неправильно используете rowconfigure и columnconfigure.Вы не указали, как вы хотите, чтобы макет реагировал на изменение размера, поэтому я просто делаю равномерное расширение каждого виджета:

from tkinter import *

class spam():
    def __init__(self, root):
        self.root = root
        self.create_buttons()
        self.create_rest_of_layout()

    def create_buttons(self):
        # Configure root window for rows and cols according to "ideal result"
        self.root.rowconfigure([0,1,2], weight=1)
        self.root.columnconfigure([0,1], weight=1)
        card_frame = Frame(self.root)
        card_frame.grid(row=0, column=0, sticky=N+S+E+W)

        # Configure 5 rows and 10 columns
        card_frame.rowconfigure([0,1,2,3,4], weight=1)
        card_frame.columnconfigure([0,1,2,3,4,5,6,7,8,9], weight=1)

        # Create a 5x10 (rows x columns) grid of buttons inside the frame
        i = 0
        for row_index in range(5):
            for col_index in range(10):
                # Set card image
                card_image = PhotoImage(file='beer.png')
                small_card_image = card_image.subsample(2, 2)
                # Create button
                btn = Button(card_frame,
                             width=5, height=5,
                             image=small_card_image,
                             bg="azure",
                             borderwidth=0,
                             command=lambda i=i: self.card_button_clicked(i))
                btn.image = small_card_image
                btn.grid(row=row_index, column=col_index, sticky=N+S+E+W)
                i = i+1

    def card_button_clicked(self,x):
        print(x)

    def create_rest_of_layout(self):
        # Create the rest of the frames
        a = Label(self.root, text='middle', bg='tan')
        a.grid(row=1, column=0, sticky=N+S+E+W)
        b = Label(self.root, text='bottom', bg='khaki')
        b.grid(row=2, column=0, sticky=N+S+E+W)
        c = Label(self.root, text='top right', bg='bisque')
        c.grid(rowspan=2, row=0, column=1, sticky=N+S+E+W)
        d = Label(self.root, text='bottom right', bg='gold')
        d.grid(row=2, column=1, sticky=N+S+E+W)

root = Tk()
spam(root)

root.mainloop()

Я думаю, что это, вероятно, не желаемое решение для макета, но оно даетвам что-то, чтобы поиграть в попытке добраться туда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...