ТТК, кнопки имеют только один номер на них
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 ответа:
Вы переопределяете
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)