我遇到了问题。我试图创建一个遍历单词列表的小程序,在列表框中显示单个单词并暂停每个单词,除非你点击下一个,或者其他什么。 我写下了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()
答案 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 ;按钮。然后,当"提交"单击按钮,将从文本框中读取输入,然后对其执行操作。