使用python tkinter的问题

时间:2016-05-04 15:12:26

标签: python tkinter tkinter-canvas

最初运行代码,闪烁将按行开始。 我的软件应该做的是,如果用户在最后一行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()

3 个答案:

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