Python-Tkinter遍历列表

Python-Tkinter遍历列表,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我被一个问题困住了。我正在尝试创建一个小程序,它遍历一个单词列表,在列表框中显示单个单词,并在每个单词处暂停,除非你点击下一个或其他什么。 我为python编写代码,这是一个很简单的问题 import random Deutsch = [] def esercizio(): rnd = random.sample(range(0, len(Deutsch)), len(Deutsch)) for i in rnd: print(Deut

我被一个问题困住了。我正在尝试创建一个小程序,它遍历一个单词列表,在列表框中显示单个单词,并在每个单词处暂停,除非你点击下一个或其他什么。 我为python编写代码,这是一个很简单的问题

import random

Deutsch = []

def esercizio():
        rnd = random.sample(range(0, len(Deutsch)), len(Deutsch))
        for i in rnd:
            print(Deutsch[i])
            input()
当然,这对TK不起作用,我不知道如何做到这一点,我不想使用
after()
方法(我知道这将是最简单的解决方案)。 这是我现在的代码:

from tkinter import *
import random

Deutsch = [['viel', 'molta'], ['Glück', 'fortuna'], ['guten', 'buon']]

class Exercise:

    def __init__(self, wlist):
        rnd = random.sample(range(0, len(wlist)), len(wlist))
        self.De = []
        self.It = []
        for i in rnd:
            self.De.append(wlist[i][0])
            self.It.append(wlist[i][1])

    def Start(self, num):
        list1.delete(0, END)
        list1.insert(END, self.De[num])
        print(self.De)

    def Next(self):
        rnd = random.sample(range(1, len(self.De)), len(self.De) - 1)
        for i in rnd:
            list1.delete(0, END)
            list1.insert(END, self.De[i])
            input()

window = Tk()
ex = Exercise(Deutsch)


window.wm_title('Esercizi di Tedesco')
l1 = Label(window, text='Parola Tedesca')
l1.grid(row=1, column=1)

l2 = Label(window, text='Traduzione suggerita')
l2.grid(row=1, column=3)

l3 = Label(window, text='Soluzione')
l3.grid(row=1, column=5)

list1 = Listbox(window, height=1, width=30)
list1.grid(row=3, column=1, rowspan=1, columnspan=1)

list2 = Listbox(window, height=1, width=30)
list2.grid(row=3, column=5, rowspan=1, columnspan=1)

sugg_text = StringVar()
e1 = Entry(window, textvariable=sugg_text)
e1.grid(row=3, column=3)

b1 = Button(window, text="Start", width=12, command=lambda: ex.Start())
b1.grid(row=3, column=6)

b2 = Button(window, text="Solution", width=12)
b2.grid(row=4, column=6)

b3 = Button(window, text="Next", width=12, command=lambda: ex.Next())
b3.grid(row=3, column=7)

b4 = Button(window, text="Close", width=12, command=window.destroy)
b4.grid(row=4, column=7)

window.mainloop()

您的问题是在tkinter的事件循环中使用了一个“阻塞”函数,
input()

tkinter和所有其他GUI框架(据我所知)都维护一个快速旋转的事件循环,使GUI保持响应。它希望它运行的所有东西都是非阻塞的(基本上是非常快完成的),因为否则,应用程序将挂起


如果您想在GUI程序中获取输入,则需要向GUI程序添加某种方式的输入,例如文本框和“提交”按钮。然后,单击“提交”按钮时,将从文本框中读取输入并对其执行操作。

您的问题是,您在tkinter的事件循环中使用了一个“阻塞”函数,
input()

tkinter和所有其他GUI框架(据我所知)都维护一个快速旋转的事件循环,使GUI保持响应。它希望它运行的所有东西都是非阻塞的(基本上是非常快完成的),因为否则,应用程序将挂起


如果您想在GUI程序中获取输入,则需要向GUI程序添加某种方式的输入,例如文本框和“提交”按钮。然后,当单击“提交”按钮时,将从文本框中读取输入,并对其进行操作。

如果我理解正确,您希望每次单击“下一步”时都有一个新的随机单词吗?将“取消列表”设置为迭代器,然后可以使用
next()
函数获取下一个

def __init__(self, wlist):
    rnd = random.sample(range(0, len(wlist)), len(wlist))
    self.De = []
    self.It = []
    for i in rnd:
        self.De.append(wlist[i][0])
        self.It.append(wlist[i][1])
    self.De = iter(self.De)
    self.It = iter(self.It)

def Next(self):
    list1.delete(0, END)
    list1.insert(END, next(self.De))

如果我理解正确,您希望每次单击“下一步”时都有一个新的随机单词吗?将“取消列表”设置为迭代器,然后可以使用
next()
函数获取下一个

def __init__(self, wlist):
    rnd = random.sample(range(0, len(wlist)), len(wlist))
    self.De = []
    self.It = []
    for i in rnd:
        self.De.append(wlist[i][0])
        self.It.append(wlist[i][1])
    self.De = iter(self.De)
    self.It = iter(self.It)

def Next(self):
    list1.delete(0, END)
    list1.insert(END, next(self.De))

我建议您自己尝试实现这一点,然后当您陷入困境时,您可以向我们展示一个说明您遇到问题的示例。为什么不在()之后使用
?刚刚添加了我的代码,谢谢您的建议!因为我希望能够以我想要的速度,而不是预定的时间间隔,浏览整个列表。如果我找不到任何解决方案是我最后的选择
after()
BTW,随机模块包含一个
shuffle
函数,可以对列表进行随机操作,因此您不必重新设计。我建议您自己尝试实现它,然后,当您陷入困境时,您可以向我们展示一个示例,说明您遇到的问题。为什么不在()之后使用
?刚刚添加了我的代码,谢谢您的建议!因为我希望能够以我想要的速度,而不是预定的时间间隔,浏览整个列表。如果我找不到任何解决方案,这是我最后的选择。
after()
BTW,随机模块包含一个
shuffle
函数,可以对列表进行随机操作,所以你不必重新设计。我想问题是这样的,我会试试你的建议,我会让你知道的!我以为问题是这样的,我会试试你的建议,我会让你知道的!