最初运行代码,闪烁将按行开始。 我的软件应该做的是,如果用户在最后一行textarea中给出输入“1”,则闪烁应该从列开始。
再次,如果用户输入“1”,则应选择该字母,并应显示在顶部文本区域,整个过程应重新开始 当用户在最后一行textarea中输入输入时,我无法控制while循环。
我是python tkinter的初学者,我无法完全按照自己的意愿行事。
提前感谢你
# your code goes here
import Tkinter
from Tkinter import *
import tkMessageBox
top = Tkinter.Tk()
content=0
def helloCallBack1():
tkMessageBox.showinfo( "Hello Python", "Hello World")
L1 = Label(top, text="Your Text Appears Here")
L1.grid(columnspan=10)
E1 = Entry(top, bd =5,width=40)
E1.grid(columnspan=10)
a1 = Tkinter.Button(top, text ="WATER",width="10", command = helloCallBack1)
a1.grid(row=4,column=0)
B = Tkinter.Button(top, text ="B", command = helloCallBack1)
B.grid(row=4,column=1)
C = Tkinter.Button(top, text ="C",command = helloCallBack1)
C.grid(row=4,column=2)
D = Tkinter.Button(top, text ="D", command = helloCallBack1)
D.grid(row=4,column=3)
E = Tkinter.Button(top, text ="E", command = helloCallBack1)
E.grid(row=4,column=4)
F = Tkinter.Button(top, text ="F", command = helloCallBack1)
F.grid(row=4,column=5)
row1 = Tkinter.Button(top, text =" ", command = helloCallBack1)
row1.grid(row=4,column=6)
a1 = Tkinter.Button(top, text ="ALARM",width="10",bg="red", command = helloCallBack1)
a1.grid(row=5,column=0)
H = Tkinter.Button(top, text ="H", command = helloCallBack1)
H.grid(row=5,column=1)
I = Tkinter.Button(top, text ="I", command = helloCallBack1)
I.grid(row=5,column=2)
J = Tkinter.Button(top, text ="J", command = helloCallBack1)
J.grid(row=5,column=3)
K = Tkinter.Button(top, text ="K", command = helloCallBack1)
K.grid(row=5,column=4)
L = Tkinter.Button(top, text ="L", command = helloCallBack1)
L.grid(row=5,column=5)
row2 = Tkinter.Button(top, text =" ", command = helloCallBack1)
row2.grid(row=5,column=6)
a1 = Tkinter.Button(top, text ="FOOD",width="10", command = helloCallBack1)
a1.grid(row=6,column=0)
N = Tkinter.Button(top, text ="N", command = helloCallBack1)
N.grid(row=6,column=1)
O = Tkinter.Button(top, text ="O",command = helloCallBack1)
O.grid(row=6,column=2)
P = Tkinter.Button(top, text ="P", command = helloCallBack1)
P.grid(row=6,column=3)
Q = Tkinter.Button(top, text ="Q",command = helloCallBack1)
Q.grid(row=6,column=4)
R = Tkinter.Button(top, text ="R", command = helloCallBack1)
R.grid(row=6,column=5)
row3 = Tkinter.Button(top, text =" ", command = helloCallBack1)
row3.grid(row=6,column=6)
a4 = Tkinter.Button(top, text ="BACKSPACE",width="10", command = helloCallBack1)
a4.grid(row=7,column=0)
S = Tkinter.Button(top, text ="S", command = helloCallBack1)
S.grid(row=7,column=1)
T = Tkinter.Button(top, text ="T", command = helloCallBack1)
T.grid(row=7,column=2)
U = Tkinter.Button(top, text ="U", command = helloCallBack1)
U.grid(row=7,column=3)
V = Tkinter.Button(top, text ="V", command = helloCallBack1)
V.grid(row=7,column=4)
W = Tkinter.Button(top, text ="W", command = helloCallBack1)
W.grid(row=7,column=5)
row4 = Tkinter.Button(top, text =" ", command = helloCallBack1)
row4.grid(row=7,column=6)
L2 = Label(top, text="Press 1 when you want to select")
L2.grid(columnspan=10)
E2 = Entry(top, bd =5,width=40)
E2.grid(columnspan=10)
content = E2.get()
content=0;
i=0;j=0;
while(i<30):
row1.after(4000*j+1000*i, lambda: row1.config(fg="red",bg="black"))
row1.after(4000*j+1000*(i+1), lambda: row1.config(fg="grey",bg=top["bg"]))
row2.after(4000*j+1000*(i+1), lambda: row2.config(fg="red",bg="black"))
row2.after(4000*j+1000*(i+2), lambda: row2.config(fg="grey",bg=top["bg"]))
row3.after(4000*j+1000*(i+2), lambda: row3.config(fg="red",bg="black"))
row3.after(4000*j+1000*(i+3), lambda: row3.config(fg="grey",bg=top["bg"]))
row4.after(4000*j+1000*(i+3), lambda: row4.config(fg="red",bg="black"))
row4.after(4000*j+1000*(i+4), lambda: row4.config(fg="grey",bg=top["bg"]))
content=E2.get()
if content==1:#this is not working
break
i=i+1
j=j+1
top.mainloop()
答案 0 :(得分:1)
问题是你的while循环像眨眼一样运行,你不能同时输入任何东西。由于@step_attributes = [#<CustomAttribute id: 7, value: "Name, Surname: ">, #<CustomAttribute id: 8, value: "Call: +555555555">]
调用闪烁仍然存在,但这并不意味着你仍然在你的诡计循环中。当你在框中输入内容时,程序就会退出该循环。
我要做的是将输入框绑定到一个键(如Return),当按下该键时,检查输入框的内容,如果是1,则停止闪烁。
此外,您可以将这些内容绑定到after
键,并避免整个Entry小部件的内容
答案 1 :(得分:1)
让我们考虑一下你想要实现的目标:你试图在一系列对象中循环,然后眨眼&#34;一次一个。您希望首先一次为一行对象执行此操作,然后一次对一个对象执行此操作。
我假设这两种行为之间唯一不同的是它迭代的项目。因此,如果您为&#34;闪烁&#34;创建通用功能顺序通过一个对象列表,你可以简单地切换哪些对象正在&#34;闪烁&#34;。
这将如何运作?让我们首先创建一个事项列表,然后眨眼&#34;:
blink_objects = [row1, row2, row3, row4]
这个想法是我们想要&#34;眨眼&#34;这些,一次一个。要更改闪烁的内容(要在问题中从行切换到列),您只需重新定义blink_objects
。
我们如何眨眼它们?执行此类动画的常规方法是创建一个绘制动画的一帧的函数,然后安排自己在短时间后再次运行。在你的情况下,这段时间是一秒钟。
让我们调用此函数blink
。我们希望它采用一些可选的args,稍后会有用。第一个是一个变量,它包含当前处于&#34;闪烁的对象。州。我们需要这个,以便我们可以改回来。第二个是我们可以用来在将来停止动画的标志。
这是函数的样子。 current_object
参数由blink
在内部传递,在从其他地方调用blink
时不应设置。
def blink(current_object = None, stop=False):
global blink_objects
# "unblink" the current object
if current_object:
current_object.configure(fg="black", bg=top["bg"])
current_object = None
if not stop:
# blink the first item in the list of objects,
# then move the object to the end of the list
current_object = blink_objects.pop(0)
blink_objects.append(current_object)
current_object.configure(bg="black", fg="red")
# schedule the blink again after a second
current_object.after(1000, blink, current_object)
您只需要调用此函数一次。它将照顾每秒钟再次呼唤自己,直到时间结束。要让它像原始程序一样闪烁,我们只需要用这两行代码替换整个while
循环:
blink_objects = [row1, row2, row3, row4]
blink()
如果您想在任何时候停止动画,可以致电blink(stop=True)
。例如,您可能希望在用户退出程序时执行此操作。
接下来,我们需要进行设置,以便输入&#34; i&#34;改变什么是眨眼。我们可以通过设置一个特定的绑定来做到这一点,当用户按下键时会立即触发:
E2.bind("<i>", change_blink_objects)
说的是&#34;如果用户按下&#39; i&#39;,请调用change_blink_objects&#34;。现在我们只需要定义change_blink_objects
。
由于从绑定调用此函数,它将传递一个表示事件的对象(按下了什么键,什么对象得到了按键等)。目前我们不需要这些信息,但我们必须接受它。
在这个功能中,我猜你会智能地选择要眨眼的对象,但我不知道那个逻辑是什么,所以我只是让它眨眼&#34;警报&#34;行。
def change_blink_objects(event):
global blink_objects
blink_objects = [H, I, J, K,. L)
您需要做的就是:创建用于闪烁对象列表的通用函数,以及调用更改对象列表的函数的绑定。
确保在您对此进行测试时,首先点击条目小部件,否则它无法确定您何时输入&#34; i&#34;。
答案 2 :(得分:0)
虽然循环和GUI不能很好地混合。 Youe while循环创建240个延迟回调,您无法取消。相反,你应该有一个有条件地创建另一个的延迟回调。这是一个未经测试的循环替代品。它结合了Gabor的答案,应该让你开始,
go = True
def stop():
go = False
root.bind('<key-1>', stop)
def blink(i, j):
if i = 0:
row1.config(fg="red",bg="black"))
if j > 0:
row4.config(fg="grey",bg=top["bg"]))
elif i = 1:
row1.config(fg="grey",bg=top["bg"]))
row2.config(fg="red",bg="black"))
elif i = 2:
row2.config(fg="grey",bg=top["bg"]))
row3.config(fg="red",bg="black"))
elif i = 3:
row3.config(fg="grey",bg=top["bg"]))
row4.config(fg="red",bg="black"))
if go and j < 30:
top.after(1000, blink, (i+1) % 4, j+1)
top.after(1000, blink, 0, 0)