ТТК, кнопки имеют только один номер на них


import tkinter
from tkinter import ttk

def main():
    root = tkinter.Tk()
    numpad = NumPad(root)
    root.mainloop()

numbers = [
'7',  '8',  '9',
'4',  '5',  '6',
'1',  '2',  '3']


class NumPad(ttk.Frame):
    def __init__(self, root):
        ttk.Frame.__init__(self, root)
        self.grid()
        self.num()

    def num(self):
        for c in range(1,4):
            for r in range(3):
                for b in numbers:
                    cmd = lambda b=b: print(b)
                    self.b= ttk.Button(self, text=b, command=cmd).grid(row = r, column = c, pady = 5)
                    #print(b)

main()

У меня проблема с этим кодом, так как когда я пытаюсь запустить его, все кнопки имеют только 3 на них, и единственный выход-3. Я попытался посмотреть, что я сделал не так, но все еще не могу найти ошибку. Он выбирает только последнее число, которое находится в функции "числа".

Любая помощь ценится.

3 2

3 ответа:

Вы переопределяете self.b в последнем внутреннем цикле. Попробуйте это:

import tkinter
from tkinter import ttk

def main():
    root = tkinter.Tk()
    numpad = NumPad(root)
    root.mainloop()

numbers = [
'7',  '8',  '9',
'4',  '5',  '6',
'1',  '2',  '3']


class NumPad(ttk.Frame):
    def __init__(self, root):
        ttk.Frame.__init__(self, root)
        self.grid()
        self.num()

    def num(self):
        for c in range(3):
            for r in range(3):
                text = numbers[c*3+r]
                cmd = lambda text=text: print(text)
                self.b= ttk.Button(self, text=text, command=cmd).grid(row = r, column = c, pady = 5)

main()

Для каждой точки в вашей сетке вы создаете 9 кнопок и кладете одну поверх другой. Только последняя кнопка (та, что соответствует 3) в конечном итоге появляется, и она появляется каждый раз. Вместо этого вам нужно вычислить индекс на основе c и r и создать только 1 кнопку:

def num(self):
    for c in range(1,4):
        for r in range(3):
            b = (c - 1) * 3 + r
            cmd = lambda b=b: print(b)
            self.b= ttk.Button(self, text=b, command=cmd).grid(row = r, column = c, pady = 5)
            #print(b)

Свяжите каждую координату строки-столбца с одним элементом из numbers, используя zip:

def num(self):
    rc_gen = ((r, c) for r in range(3) for c in range(3))
    for (r, c), num in zip(rc_gen, numbers):
        cmd = lambda num=num: print(num)
        self.b = ttk.Button(self, text=num, command=cmd).grid(row=r, column=c, pady=5)