tkinter постепенно отображает целые числа на кнопках при нажатии - PullRequest
1 голос
/ 05 февраля 2020

В серии, скажем, 5 объектов Button, я бы хотел, чтобы при первом нажатии на кнопку ее текстовый параметр обновлялся до номера 1. Затем, когда я нажимаю вторую кнопку, независимо от того, какая из них мне нужна отобразить 2, затем 3, до 5.

Вот моя попытка, она продолжает отображать 1 и не повторяется.

import tkinter as tk

root = tk.Tk()
root.geometry('300x200')
buttons = []

def callback(num):
    buttons[num].config(text=next(iter(range(1, 5))))

for i in range(5):
    buttons.append(tk.Button(root, text='?', width=6, height=3, command=lambda x=i: callback(x)))

for j in buttons:
    j.pack(side='left')

root.mainloop()

дополнительная информация: у меня могут быть трудности с пониманием как работает обратный вызов, используя лямбду вместо прямого вызова, и неправильное использование последнего может быть причиной того, что она не работает должным образом. Это также первый раз, когда я использую next () и iter (), и, возможно, сделал это неправильно.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Вам нужно разделить определение итератора и вызовы next(), в противном случае вы каждый раз создавали новый итератор.

Вам также нужно поместить 6 в iter(range(1, 6)), если вы хотите, чтобы он go до 5.

Попробуйте:

import tkinter as tk

root = tk.Tk()
root.geometry('300x200')
buttons = []
my_iter = iter(range(1, 6))

def callback(num):
    buttons[num].config(text=next(my_iter))

for i in range(5):
    buttons.append(tk.Button(root, text='?', width=6, height=3, command=lambda x=i: callback(x)))

for j in buttons:
    j.pack(side='left')

root.mainloop()
1 голос
/ 05 февраля 2020

Обратите внимание на следующее:

buttons[num].config(text=next(iter(range(1, 5))))

Вы создаете новый итератор при каждом нажатии кнопки. Вместо этого вы должны определить его в глобальной области видимости и вызывать следующий при каждом нажатии кнопки:

a = iter(range(1, 5))

def callback(num):
    buttons[num].config(text=next(a))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...