#!/usr/bin/env python # -*- mode: python; coding: utf-8; -*- # --------------------------------------------------------------------------- # # Copyright (C) 1998-2003 Markus Franz Xaver Johannes Oberhumer # Copyright (C) 2003 Mt. Hood Playing Card Co. # Copyright (C) 2005-2009 Skomoroh # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # --------------------------------------------------------------------------- import tkinter from pysollib.ui.tktile.tkconst import EVENT_PROPAGATE TclError = tkinter.TclError # ************************************************************************ # * Wrapper class for Tk. # * Required so that a Game will get properly destroyed. # ************************************************************************ class MfxRoot(tkinter.Tk): def __init__(self, **kw): tkinter.Tk.__init__(self, **kw) self.app = None self.wm_protocol('WM_DELETE_WINDOW', self.wmDeleteWindow) # for interruptible sleep # self.sleep_var = tkinter.IntVar(self) # self.sleep_var.set(0) self.sleep_var = 0 self.after_id = None # self.bind('', self._sleepEvent, add=True) def connectApp(self, app): self.app = app # sometimes an update() is needed under Windows, whereas # under Unix an update_idletasks() would be enough... def busyUpdate(self): game = None if self.app: game = self.app.game if not game: self.update() else: old_busy = game.busy game.busy = 1 if game.canvas: game.canvas.update() self.update() game.busy = old_busy def mainquit(self): self.after_idle(self.quit) def screenshot(self, filename): # print 'MfxRoot.screenshot not yet implemented' pass def setCursor(self, cursor): if 0: # FIXME: this causes ugly resizes ! tkinter.Tk.config(self, cursor=cursor) elif 0: # and this is even worse # print self.children for v in self.children.values(): v.config(cursor=cursor) else: pass # # sleep # def sleep(self, seconds): # time.sleep(seconds) self.after(int(seconds*1000)) return print('sleep', seconds) timeout = int(seconds*1000) self.sleep_var = 0 while timeout > 0: self.update() self.update_idletasks() if self.sleep_var: break self.after(100) timeout -= 100 print('finish sleep') return if self.after_id: self.after_cancel(self.after_id) self.after_id = self.after(int(seconds*1000), self._sleepEvent) self.sleep_var.set(1) self.update() self.wait_variable(self.sleep_var) if self.after_id: self.after_cancel(self.after_id) self.after_id = None print('finish sleep') def _sleepEvent(self, *args): return print('_sleepEvent', args) self.interruptSleep() return EVENT_PROPAGATE def interruptSleep(self): return print('interruptSleep') self.update() self.update_idletasks() self.sleep_var = 1 # self.sleep_var.set(0) # self.after_idle(self.sleep_var.set, 0) # # # def _focusInEvent(self, *args): if self.app: self.app.raiseAll() def _focusOutEvent(self, *args): if self.app: self.app.unraiseAll() def update(self): tkinter.Tk.update(self) def wmDeleteWindow(self): if self.app and self.app.menubar: self.app.menubar.mQuit() else: # self.after_idle(self.quit) pass