How can I make the button text change, from text to an empty name with a delay?

半腔热情 提交于 2019-12-02 15:47:01

问题


I'm using tkinter library for the GUI. Basically I'm creating 4 buttons using a for loop, each having a random number as their text. Now I got stuck when trying to implement a method which allows the button text to appear as a number and then change to nothing in a second or so (After this is done the next button would do the same process). So the method would allow each button to flash it's number and moves on to the next (Until all the buttons flashed their numbers for one time).

This is the code which I got so far

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

A picture of the output.So far I figured that I need to import the time library and use the sleep() method to get the delay needed. But I still need to:

Allow the panel to load with the buttons (Without any numbers) Then the buttons start to flash the number one after each other until all buttons flashed the number for one time.


回答1:


Memory is everything !

#!/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()


来源:https://stackoverflow.com/questions/32026492/how-can-i-make-the-button-text-change-from-text-to-an-empty-name-with-a-delay

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!