1
votes

I wanted to cerate a message window on top of root window which looks similar from this link. A message window with a message and an inactive button untill some portion of the code are done and then to display a message with an active button. This is how the code structure looks like(I have cut through specific details to just clear the point how my code flow looks like)

The second window is not working, instead the window appears at the end of the function. Can somebody help.

from Tkinter import *
import tkMessageBox

def a():
    return

def b():
    . . .
    . . .
    msg_window = Toplevel()
    msg_window.grapset()
    msg_window.title( ___ )
    msg_geometry( ___ )
    msgLabel = Label(window)
    msgLabel["text"]="Processing...."
    msgLabel.pack()
    btn = Button(msg_window, text="Ok", command=msg_window.destroy())
    btn.pack()
    btn.config(state=DISABLED)
    a()
    c()
    d()
    d()
    msgLabel["text"]="Done"
    msgLabel.pack()
    btn = Button(msg_window, text="Ok", command=msg_window.destroy())
    btn.pack()
    btn.config(state=NORMAL)
    e()
    if tkMessageBox.askyesno( ___ ):
        do something
    else:
        do something
    pass

def c():
    return

def d():
    return

def e():
    return

root = Tk()
frame = Frame( ___ )
frame.pack()
but_find = Button( ___ )
but_find.pack()
but_start = Button( ___ )
but_start.pack()
but_exit = Button( ___ )
but_exit.pack()
root.mainloop()

Explanation: I am building an application where the root window contains 3 buttons. When start button is clicked, function b is called, which in turn calls various other functions inside function b itself. This is the point where, i want to create a second window that shows up above the root window and making the root window inactive until function b gets completed or until the second window is destroyed.

What i want is.. The second window(contains 2 things- a message and a button) should start inside the function b after some steps. It should display the message Processing.... and an inactive button called Ok before function a starts and should appear until function d gets completed. Then, i want to display Done with an active 'Ok' button that destroys the second window. Then make the root window active.

1
keep playing around, don't start anything too ambitious if you are just getting started. Here is a great tkinter resource effbot.org/tkinterbook. If you are just getting started with python i would suggest to use python3 as it is the future. - timeyyy

1 Answers

2
votes

Try developing your own dialog. Example:

import Tkinter as tk


class CustomDialog(tk.Toplevel):
    def __init__(self, title, message, command1=self.ok, command2=self.ok, command3=self.ok, buttontext1="button1", buttontext2="button2", buttontext3="button3"):
        self.base = tk.Toplevel()
        self.base.title(title)
        self.label = tk.Label(self.base, text=message)
        self.label.pack()
        self.label.grid(row=0, column=0, columnspan=3, sticky=N)
        self.button1 = tk.Button(self.base, text=buttontext1, command=command1)
        self.button1.pack()
        self.button1.grid(row=1, column=0, sticky=N)
        self.button2 = tk.Button(self.base, text=buttontext2, command=command2)
        self.button2.pack()
        self.button2.grid(row=1, column=1, sticky=N)
        self.button3 = tk.Button(self.base, text=buttontext3, command=command3)
        self.button3.pack()
        self.button3.grid(row=1, column=2, sticky=N)
    def ok(self, event=None):
        self.destroy()
    def baseconfig(self, option, value):
        self.base[option] = value
    def labelconfig(self, option, value):
        self.label[option] = value
    def buttonconfig(self, number, option, value):
        exec "self.button%s[option] = value" % str(number)

def customDialog(title, message, command1=self.ok, command2=self.ok, command3=self.ok, buttontext1="button1", buttontext2="button2", buttontext3="button3", button1ret=None, button2ret=None, button3ret=None):
    def _button1press():
        command1()
        return button1ret
    def _button2press():
        command2()
        return button2ret
    def _button3press():
        command3()
        return button3ret
    dialog = CustomDialog(title, message, _button1press, _button2press, _button3press, buttontext1, buttontext2, buttontext3)

And to disable the first button, call self.buttonconfig(1, state, DISABLED) (1 refers to the number of the button). To enable it, use self.buttonconfig(1, state, NORMAL).