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

Итак, я хочу создать окно, которое будет циклически повторять термины при нажатии, а также переворачивать карточку, когда нажата другая кнопка, и все это работает, но кнопка может щелкнуть только один раз.Я нажимаю первый раз, и появляется следующее слово, но во второй раз ничего не происходит.Это одинаково для обеих кнопок.

def flashCard():
    global i
    global j
    i=0
    j=0
    word = tmp[0][0]
    flashCard1 = Toplevel()
    flashCard1.title("Flash Cards!")
    flashCard1.geometry("450x200")

    term = Label(flashCard1, text=word, font=("Helvetica", 32, "bold"))
    term.grid(row=0, column=0, padx=150, pady=75, columnspan=2)

    def flip(i,j):
        if j == 0:
            term.configure(text=tmp[i][1])
        elif j == 1:
            term.configure(text=tmp[i][0])

    def nextC(i,j):
        i=i+1
        try:
            term.configure(text=tmp[i][0])
        except:
            messagebox.showinfo("Error", "No more cards - back to beginning")
            i=0
            term.configure(text=tmp[i][0])

    flipBtn = Button(flashCard1, text="See other side", command=lambda: flip(i,j))
    flipBtn.grid(row=1, column=0)

    nextBtn = Button(flashCard1, text="See next card", command=lambda: nextC(i,j))
    nextBtn.grid(row=1, column=1)

Спасибо!

Ответы [ 2 ]

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

Увеличение i и j в вашей функции только увеличивает их локально, вы можете обойти это, передав изменяемый объект в метод, такой как список. Reference .Для этого я заменил i и j списком indices, остальное точно так же, как я называю indices[0], когда вам нужно внести изменения в i и indices[1] для изменений в j.

from tkinter import *
from tkinter import messagebox


def flashCard():
    indices = [0,0]

    flashCard1 = Tk()
    tmp = [[str(y)+str(x) for x in range(2)] for y in range(20)]
    print(tmp)
    word = tmp[indices[0]][indices[1]]
    flashCard1.title("Flash Cards!")
    flashCard1.geometry("450x200")

    term = Label(flashCard1, text=word, font=("Helvetica", 32, "bold"))
    term.grid(row=0, column=0, padx=150, pady=75, columnspan=2)

    def flip(indices):
        if indices[1] == 0:
            indices[1]+=1
            term.configure(text=tmp[indices[0]][indices[1]])
        elif indices[1] == 1:
            indices[1]-=1
            term.configure(text=tmp[indices[0]][indices[1]])

    def nextC(indices):
        indices[0]=indices[0]+1
        try:
            term.configure(text=tmp[indices[0]][0])
        except:
            messagebox.showinfo("Error", "No more cards - back to beginning")
            indices[0]=0
            term.configure(text=tmp[indices[0]][0])

    flipBtn = Button(flashCard1, text="See other side", command=lambda:flip(indices))
    flipBtn.grid(row=1, column=0)

    nextBtn = Button(flashCard1, text="See next card", command=lambda:nextC(indices))
    nextBtn.grid(row=1, column=1)

    mainloop()

flashCard()

Я инициализировал tmp для целей тестирования.Но вы можете иметь его в любом размере (n,2)

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

Основная проблема заключается в том, что вы передаете i и j в качестве параметров функциям обратного вызова, поэтому при увеличении i вы увеличиваете этот локальный параметр, а не глобальную переменнуюодно и то же имяУдалите параметры и добавьте global i внутри функции.Кроме того, вы никогда не меняете j, таким образом, вы не можете перевернуть карту обратно (в случае, если это предусмотрено, вам вообще не нужно j).Кроме того, вы можете упростить функцию nextC, используя % len(tmp) вместо Try/except.

def flip():
    global j
    j = 0 if j else 1
    term.configure(text=tmp[i][j])

def nextC():
    global i, j
    i, j = (i+1) % len(tmp), 0
    term.configure(text=tmp[i][0])

flipBtn = Button(flashCard1, text="See other side", command=flip)
nextBtn = Button(flashCard1, text="See next card", command=nextC)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...