sig
  val openTk :
    ?display:string -> ?clas:string -> unit -> Widget.toplevel Widget.widget
  val mainLoop : unit -> unit
  val closeTk : unit -> unit
  val destroy : 'Widget.widget -> unit
  val update : unit -> unit
  val appname_get : unit -> string
  val appname_set : string -> unit
  type units =
    [ `Cm of float | `In of float | `Mm of float | `Pix of int | `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:'Widget.widget ->
    ?anchor:Tk.anchor ->
    ?before:'Widget.widget ->
    ?expand:bool ->
    ?fill:Tk.fillMode ->
    ?inside:'Widget.widget ->
    ?ipadx:int ->
    ?ipady:int ->
    ?padx:int -> ?pady:int -> ?side:Tk.side -> 'Widget.widget list -> unit
  val grid :
    ?column:int ->
    ?columnspan:int ->
    ?inside:'Widget.widget ->
    ?ipadx:int ->
    ?ipady:int ->
    ?padx:int ->
    ?pady:int ->
    ?row:int ->
    ?rowspan:int -> ?sticky:string -> 'Widget.widget list -> unit
  type borderMode = [ `Ignore | `Inside | `Outside]
  val place :
    ?anchor:Tk.anchor ->
    ?bordermode:Tk.borderMode ->
    ?height:int ->
    ?inside:'Widget.widget ->
    ?relheight:float ->
    ?relwidth:float ->
    ?relx:float ->
    ?rely:float -> ?width:int -> ?x:int -> ?y:int -> 'Widget.widget -> unit
  val raise_window : ?above:'Widget.widget -> 'Widget.widget -> unit
  val lower_window : ?below:'Widget.widget -> 'Widget.widget -> unit
  type modifier =
    [ `Alt
    | `Button1
    | `Button2
    | `Button3
    | `Button4
    | `Button5
    | `Control
    | `Double
    | `Lock
    | `Meta
    | `Mod1
    | `Mod2
    | `Mod3
    | `Mod4
    | `Mod5
    | `Shift
    | `Triple]
  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
    | `Modified of Tk.modifier list * Tk.event
    | `Motion
    | `Property
    | `Reparent
    | `Unmap
    | `Visibility]
  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
    | `BorderWidth
    | `ButtonNumber
    | `Char
    | `Count
    | `Detail
    | `Focus
    | `Height
    | `KeyCode
    | `KeySymInt
    | `KeySymString
    | `Mode
    | `MouseX
    | `MouseY
    | `OverrideRedirect
    | `Place
    | `RootWindow
    | `RootX
    | `RootY
    | `SendEvent
    | `State
    | `SubWindow
    | `Time
    | `Type
    | `Widget
    | `Width]
  val bind :
    events:Tk.event list ->
    ?extend:bool ->
    ?breakable:bool ->
    ?fields:Tk.eventField list ->
    ?action:(Tk.eventInfo -> unit) -> 'Widget.widget -> unit
  val bind_class :
    events:Tk.event list ->
    ?extend:bool ->
    ?breakable:bool ->
    ?fields:Tk.eventField list ->
    ?action:(Tk.eventInfo -> unit) -> ?on:'Widget.widget -> string -> unit
  val bind_tag :
    events:Tk.event list ->
    ?extend:bool ->
    ?breakable:bool ->
    ?fields:Tk.eventField list ->
    ?action:(Tk.eventInfo -> unit) -> ?on:'Widget.widget -> string -> unit
  val break : unit -> unit
end