如何将冷却时间设置为Tkinter按钮

时间:2017-09-05 19:21:19

标签: python button tkinter

我正在制作一个有4帧/页的投票系统,我使用它来筛选。按钮控制下一步的位置。

有一个outro页面应该有30秒的冷却时间;该按钮应该在重新启用后将用户发送到起始页面。

问题是,按钮仅在第一次运行时被给予冷却,其余时间被启用。 这个按钮存储在一个类中,所以有没有任何方法我可以在每次启动outro帧时重新初始化该类?

这是代码:

class outropage(Frame):

    def __init__(self, parent, controller):
        self.controller = controller
        self.parent = parent

        Frame.__init__(self, parent)

        self.intro_img = ImageTk.PhotoImage(Image.open(
            'outro.jpg').resize((1024, 705), Image.ANTIALIAS))
        self.intro_img_label = Label(self, image=self.intro_img)
        self.intro_img_label.place(x=0, y=0, relwidth=1, relheight=1)

        show_startpage = ttk.Button(self, text='Retrurn to start page',
                                    command=lambda: self.controller.show_frame(intropage), state='disabled')
        show_startpage.pack(side=BOTTOM)
        show_startpage.after((1000 * 30), lambda: show_startpage.config(state='enabled'))

更改框架的代码:

class VotingSystem(Tk):

    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        self.state('zoom')
        self.geometry('1020x700')
        self.wm_title('Student Council Elections 2017-18')

        icon = ImageTk.PhotoImage(Image.open(
            'logo.ico'))
        self.call('wm', 'iconphoto', self._w, icon)

        # Program can now only be exited through task manager.
        # self.protocol("WM_DELETE_WINDOW", self.__callback)

        container = Frame(self)
        container.pack(side=TOP, fill=BOTH, expand=True)

        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (intropage, Headboy, Headgirl, D_Headboy, D_Headgirl, outropage):
            frame = F(container, self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky='nsew')

        self.show_frame(intropage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

    @staticmethod
    def __callback():
        return

1 个答案:

答案 0 :(得分:0)

假设您最初将callback函数附加到按钮button作为命令:

button = tk.Button(root, command=callback)

您可以修改callback功能,以便在按下时禁用按钮,稍后使用after方法重新启用它:

def callback():
    original_operations()
    button.config(state='disabled')
    button.after(3000, lambda: button.config(state='active'))

现在,使用新的回调重新定义button,就像您在第一时间所做的那样:

button = tk.Button(root, command=callback)

以下示例显示一个带有单个按钮的窗口,按下时会打印'voted',然后被禁用一秒钟,然后再启用。

def callback():
    print("voted")
    button.config(state='disabled')
    button.after(1000, lambda: button.config(state='active'))


root = tk.Tk()
button = tk.Button(root, text="Vote", command=callback)
button.pack()
root.mainloop()