sig
  val openTk :
    ?display:string -> ?clas:string -> unit -> Widget.toplevel Widget.widget
  val mainLoop : unit -> unit
  val closeTk : unit -> unit
  val destroy : 'a Widget.widget -> unit
  val update : unit -> unit
  val appname_get : unit -> string
  val appname_set : string -> unit
  type units = [ `Pix of int
               | `Cm of float
               | `In of float
               | `Mm of float
               | `Pt of float]
  val pixels : Tk.units -> int
  type anchor = [ `Center | `E | `N | `Ne | `Nw | `S | `Se | `Sw | `W]
  and fillMode = [ `Both | `None | `X | `Y]
  and side = [ `Bottom | `Left | `Right | `Top]
  val pack :
    ?after:'a Widget.widget ->
    ?anchor:Tk.anchor ->
    ?before:'b Widget.widget ->
    ?expand:bool ->
    ?fill:Tk.fillMode ->
    ?inside:'c Widget.widget ->
    ?ipadx:int ->
    ?ipady:int ->
    ?padx:int -> ?pady:int -> ?side:Tk.side -> 'd Widget.widget list -> unit
  val grid :
    ?column:int ->
    ?columnspan:int ->
    ?inside:'a Widget.widget ->
    ?ipadx:int ->
    ?ipady:int ->
    ?padx:int ->
    ?pady:int ->
    ?row:int ->
    ?rowspan:int -> ?sticky:string -> 'b Widget.widget list -> unit
  type borderMode = [ `Ignore | `Inside | `Outside]
  val place :
    ?anchor:Tk.anchor ->
    ?bordermode:Tk.borderMode ->
    ?height:int ->
    ?inside:'a Widget.widget ->
    ?relheight:float ->
    ?relwidth:float ->
    ?relx:float ->
    ?rely:float -> ?width:int -> ?x:int -> ?y:int -> 'b Widget.widget -> unit
  val raise_window : ?above:'a Widget.widget -> 'b Widget.widget -> unit
  val lower_window : ?below:'a Widget.widget -> 'b Widget.widget -> unit
  type modifier = [ `Control
                  | `Shift
                  | `Lock
                  | `Button1
                  | `Button2
                  | `Button3
                  | `Button4
                  | `Button5
                  | `Double
                  | `Triple
                  | `Mod1
                  | `Mod2
                  | `Mod3
                  | `Mod4
                  | `Mod5
                  | `Meta
                  | `Alt]
  and event = [ `ButtonPress
              | `ButtonPressDetail of int
              | `ButtonRelease
              | `ButtonReleaseDetail of int
              | `Circulate
              | `ColorMap
              | `Configure
              | `Destroy
              | `Enter
              | `Expose
              | `FocusIn
              | `FocusOut
              | `Gravity
              | `KeyPress
              | `KeyPressDetail of string
              | `KeyRelease
              | `KeyReleaseDetail of string
              | `Leave
              | `Map
              | `Motion
              | `Property
              | `Reparent
              | `Unmap
              | `Visibility
              | `Modified of modifier list * event]
  and eventInfo = {
    mutable ev_Above : int;
    mutable ev_ButtonNumber : int;
    mutable ev_Count : int;
    mutable ev_Detail : string;
    mutable ev_Focus : bool;
    mutable ev_Height : int;
    mutable ev_KeyCode : int;
    mutable ev_Mode : string;
    mutable ev_OverrideRedirect : bool;
    mutable ev_Place : string;
    mutable ev_State : string;
    mutable ev_Time : int;
    mutable ev_Width : int;
    mutable ev_MouseX : int;
    mutable ev_MouseY : int;
    mutable ev_Char : string;
    mutable ev_BorderWidth : int;
    mutable ev_SendEvent : bool;
    mutable ev_KeySymString : string;
    mutable ev_KeySymInt : int;
    mutable ev_RootWindow : int;
    mutable ev_SubWindow : int;
    mutable ev_Type : int;
    mutable ev_Widget : Widget.any Widget.widget;
    mutable ev_RootX : int;
    mutable ev_RootY : int;
  } 
  and eventField = [ `Above
                   | `ButtonNumber
                   | `Count
                   | `Detail
                   | `Focus
                   | `Height
                   | `KeyCode
                   | `Mode
                   | `OverrideRedirect
                   | `Place
                   | `State
                   | `Time
                   | `Width
                   | `MouseX
                   | `MouseY
                   | `Char
                   | `BorderWidth
                   | `SendEvent
                   | `KeySymString
                   | `KeySymInt
                   | `RootWindow
                   | `SubWindow
                   | `Type
                   | `Widget
                   | `RootX
                   | `RootY]
  val bind :
    events:Tk.event list ->
    ?extend:bool ->
    ?breakable:bool ->
    ?fields:Tk.eventField list ->
    ?action:(Tk.eventInfo -> unit) -> 'a Widget.widget -> unit
  val bind_class :
    events:Tk.event list ->
    ?extend:bool ->
    ?breakable:bool ->
    ?fields:Tk.eventField list ->
    ?action:(Tk.eventInfo -> unit) -> ?on:'a Widget.widget -> string -> unit
  val bind_tag :
    events:Tk.event list ->
    ?extend:bool ->
    ?breakable:bool ->
    ?fields:Tk.eventField list ->
    ?action:(Tk.eventInfo -> unit) -> ?on:'a Widget.widget -> string -> unit
  val break : unit -> unit
end