Python - Tkinter迭代列表

时间:2018-02-01 17:29:36

标签: 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(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()

2 个答案:

答案 0 :(得分:2)

If I understand you correctly you want a new random word every time you click Next? Make your De list an iterator, then you can grab the next one with the next() function.

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))

答案 1 :(得分:1)

您的问题是您正在使用"阻止"函数input(),在tkinter的事件循环中。

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

如果你想在GUI程序中输入,你需要添加一些输入 GUI程序,如文本框和"提交&#34 ;按钮。然后,当"提交"单击按钮,将从文本框中读取输入,然后对其执行操作。