【问题标题】:How can I make the button text change, from text to an empty name with a delay?如何使按钮文本从文本更改为延迟的空名称?
【发布时间】:2015-11-08 16:18:37
【问题描述】:

我正在为 GUI 使用 tkinter 库。基本上我正在使用 for 循环创建 4 个按钮,每个按钮都有一个随机数作为它们的文本。现在我在尝试实现一种允许按钮文本显示为数字然后在一秒钟左右变为空的方法时陷入困境(完成此操作后,下一个按钮将执行相同的过程)。因此,该方法将允许每个按钮闪烁它的数字并移动到下一个(直到所有按钮都闪烁一次它们的数字)。

这是我目前得到的代码

from tkinter import *
from tkinter.messagebox import showinfo
from random import randint

def set_colors(a):
    if a == 0:
        return "red"
    elif a == 1:
        return "green"
    elif a == 2:
        return "blue"
    elif a == 3:
        return "yellow"

def set_random():
    random_int = 0
    random_int = randint(0, 100)
    return random_int

LARGE_FONT = ("Verdana",20)
color = 0

root = Tk()
frame = Frame(root)
root.title("Test")
root.geometry("200x200")
root.resizable(0, 0)

Grid.rowconfigure(root, 0, weight=1)
Grid.columnconfigure(root, 0, weight=1)
frame.grid(row=0, column=0, sticky=N + S + E + W)
grid = Frame(frame)
grid.grid(sticky=N + S + E + W, column=0, row=7, columnspan=2)
Grid.rowconfigure(frame, 7, weight=1)
Grid.columnconfigure(frame, 0, weight=1)



for x in range(2):
    for y in range(2):  
        rand_no = set_random()
        btn = rand_no
        btn = Button(frame, text=btn, bg=set_colors(color) , font=LARGE_FONT)
        btn.grid(column=x, row=y, sticky=N + S + E + W)
        color += 1

for x in range(2):
  Grid.columnconfigure(frame, x, weight=1)

for y in range(2):
  Grid.rowconfigure(frame, y, weight=1)

root.mainloop()

输出的图片。到目前为止,我认为我需要导入时间库并使用 sleep() 方法来获得所需的延迟。但我仍然需要:

允许面板加载按钮(没有任何数字) 然后按钮开始一个接一个地闪烁数字,直到所有按钮都闪烁数字一次。

【问题讨论】:

    标签: python python-3.x button tkinter tk


    【解决方案1】:

    记忆就是一切!

    #!/usr/bin/python
    import os
    import thread,time
    import random
    
    import math
    
    try:
        dirs = os.path.dirname(os.__file__).lower()
        if "python2" in dirs:
            from Tkinter import *
        elif "python3" in dirs:
            from tkinter import *
    except Exception,e : print e
    
    LARGE_FONT = ("Verdana",20)
    color = 0
    
    root = Tk()
    frame = Frame(root)
    root.title("Very Hard Memory Game !")
    root.geometry("200x200")
    root.resizable(0, 0)
    
    Grid.rowconfigure(root, 0, weight=1)
    Grid.columnconfigure(root, 0, weight=1)
    frame.grid(row=0, column=0, sticky=N + S + E + W)
    grid = Frame(frame)
    grid.grid(sticky=N + S + E + W, column=0, row=8, columnspan=2)
    Grid.rowconfigure(frame, 8, weight=1)
    Grid.columnconfigure(frame, 0, weight=1)
    
    class _zo : pass
    zo = _zo()
    zo.foo = []
    zo.pick = None
    zo.lq =[]
    zo.a = {}
    zo.level = 0
    zo.lev_list = [4,9,16,25,36,49,64,81]
    zo.miss = 0
    
    
    def get_num(num):
        h = sorted(zo.a.keys())
        p = zo.foo.index(num)
        if num in zo.lq and num == zo.pick :
            zo.a["%0.2d_%d"%(p,num)].config(text=num, state="disabled")
    
            if len(zo.lq) > 1 :
                zo.lq.remove(num)
                zo.pick = ( random.choice(zo.lq))
                zo.a["my_lab"].config(text= "where is %d ?" % zo.pick)
            elif len(zo.lq) == 1:
                zo.lq = []
                zo.foo = []
                zo.pick = None
                zo.level = zo.level +1
                for s in zo.a.keys() :
                    zo.a[s].destroy()
                zo.a = {}
                do_cube(zo.lev_list[zo.level])
    
        
        else:
            zo.miss += 1
            zo.a["my_lab"].config(text="Try again for (%d)!(Miss:%s)"%(zo.pick,zo.miss))    
            
    
    
    
    
    def timot(hu):
        time.sleep(2)
        n = sorted(zo.a.keys())   
    
        for s in n :
            if not s.startswith("my"):
                y = zo.foo[n.index(s)]
                zo.a[s].config(text=y)
                time.sleep(1)
                zo.a[s].config(text="")
        zo.pick = random.choice(zo.foo)
        for j in n: zo.a[j].config(state="normal")
        zo.a["my_lab"].config(text="where is %d ?" %zo.pick)
    
    def do_cube(many):
        bx = int(math.sqrt(many))
        w = (200+(200*(zo.level*0.15)))
        root.geometry("%dx%d+400+200" %(w,w+(20+(5*zo.level))))
        
        
        color = "orange","red","green","blue","yellow","brown","dodgerblue","pink"
        zo.foo  = random.sample(range(100),many)
        zo.lq = [e for e in zo.foo]
    
        for x in range(bx):
            for y in range(bx):
                ind = (x*bx) + y  
                rand_no = zo.foo[ind]
                
                butn = Button(frame, bg=color[x], command= lambda rand_no=rand_no:get_num(rand_no), font=LARGE_FONT,state="disabled")
                butn.grid(column=x, row=y, sticky=N + S + E + W)
    
                zo.a["%0.2d_%d"%(ind,rand_no)] = butn
                
        for x in range(bx):
            Grid.columnconfigure(frame, x, weight=1)
        for y in range(bx):
            Grid.rowconfigure(frame, y, weight=1)
    
        zo.a["my_lab"] = Label(root,text="ready !")
        zo.a["my_lab"].grid(column=0, row=bx+1, sticky=N + S + E + W,columnspan = bx)
        
        
        thread.start_new_thread(timot,(None,))
    
    
    do_cube(zo.lev_list[zo.level])
    
    
    root.mainloop()
    

    【讨论】:

    • 给我一个错误:/ Traceback(最近一次调用最后一次):文件“C:\Users\Neo\My Documents\LiClipse Workspace\Lesson_1\Test.py”,第 2 行,在 import thread,time ImportError: No module named 'thread'
    • 想通了,但在这段代码中,数字不是一个接一个地闪现
    • 调整了一些代码,得到了我想要的谢谢!
    • 哇,您更新的代码与我的想法非常相似,感谢这对我帮助很大,因为我是 python 新手,虽然它很容易理解!感谢更新代码:)
    • @pebbleHit 不客气,我喜欢你的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 2022-07-07
    • 2022-09-29
    • 2011-07-12
    相关资源
    最近更新 更多