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 ]
  type fillMode = [ `Both | `None | `X | `Y ]
  type 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 ]
  type 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 ]
  type 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;
  }
  type 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