From 4cebac735eac4a400d10905a138711bda2321db4 Mon Sep 17 00:00:00 2001 From: skomoroh Date: Sat, 4 Nov 2006 22:20:36 +0000 Subject: [PATCH] * improved tile binding git-svn-id: https://pysolfc.svn.sourceforge.net/svnroot/pysolfc/PySolFC/trunk@85 39dd0a4e-7c14-0410-91b3-c4f2d318f732 --- data/tcl/menu8.4.tcl | 357 ++++++++++++++++++++++++++++++++++ pysollib/games/fan.py | 10 +- pysollib/init.py | 42 ++-- pysollib/main.py | 46 ++--- pysollib/pysolaudio.py | 26 +-- pysollib/pysolgtk/tkwidget.py | 2 + pysollib/settings.py | 3 +- pysollib/tile/tkutil.py | 6 + pysollib/tile/tkwidget.py | 53 ++--- pysollib/tile/toolbar.py | 23 +-- 10 files changed, 453 insertions(+), 115 deletions(-) create mode 100644 data/tcl/menu8.4.tcl diff --git a/data/tcl/menu8.4.tcl b/data/tcl/menu8.4.tcl new file mode 100644 index 00000000..91e96f36 --- /dev/null +++ b/data/tcl/menu8.4.tcl @@ -0,0 +1,357 @@ +# this file from tkabber project + +namespace eval :: { + +proc myMenuButtonDown {args} { + global myMenuFlag myMenuMotion + eval ::tk::MenuButtonDown $args + set myMenuFlag 1 +} +proc myMenuInvoke {args} { + global myMenuFlag myMenuMotion + if {$myMenuFlag || $myMenuMotion} { + eval ::tk::MenuInvoke $args + } + set myMenuFlag 0 + set myMenuMotion 0 +} +proc myMenuMotion {args} { + global myMenuFlag myMenuMotion + eval ::tk::MenuMotion $args + set myMenuMotion 1 +} +proc myMenuLeave {args} { + global myMenuFlag myMenuMotion + eval ::tk::MenuLeave $args + set myMenuMotion 0 +} +bind Menu {myMenuLeave %W %X %Y %s} +bind Menu {myMenuButtonDown %W} +bind Menu {myMenuInvoke %W 1} +bind Menu {myMenuMotion %W %x %y %s} +set myMenuFlag 0 +set myMenuMotion 0 + +# ::tk::MenuNextEntry -- +# Activate the next higher or lower entry in the posted menu, +# wrapping around at the ends. Disabled entries are skipped. +# +# Arguments: +# menu - Menu window that received the keystroke. +# count - 1 means go to the next lower entry, +# -1 means go to the next higher entry. + +proc ::tk::MenuNextEntry {menu count} { + global ::tk::Priv + + if {[string equal [$menu index last] "none"]} { + return + } + set length [expr {[$menu index last]+1}] + set quitAfter $length + set active [$menu index active] + if {[string equal $active "none"]} { + set i 0 + } else { + set i [expr {$active + $count}] + } + while {1} { + if {$quitAfter <= 0} { + # We've tried every entry in the menu. Either there are + # none, or they're all disabled. Just give up. + + return + } + while {$i < 0} { + incr i $length + } + while {$i >= $length} { + incr i -$length + } + if {[catch {$menu entrycget $i -state} state] == 0} { + if {[string compare $state "disabled"]} { + break + } + } + if {$i == $active} { + return + } + incr i $count + incr quitAfter -1 + } + $menu activate $i + ::tk::GenerateMenuSelect $menu + if {[string equal [$menu type $i] "cascade"]} { + set cascade [$menu entrycget $i -menu] + if {[string equal [$menu cget -type] "menubar"] && [string compare $cascade ""]} { + # Here we auto-post a cascade. This is necessary when + # we traverse left/right in the menubar, but undesirable when + # we traverse up/down in a menu. + $menu postcascade $i + ::tk::MenuFirstEntry $cascade + } + } +} + +# ::tk::MenuNextMenu -- +# This procedure is invoked to handle "left" and "right" traversal +# motions in menus. It traverses to the next menu in a menu bar, +# or into or out of a cascaded menu. +# +# Arguments: +# menu - The menu that received the keyboard +# event. +# direction - Direction in which to move: "left" or "right" + +proc ::tk::MenuNextMenu {menu direction} { + global ::tk::Priv + + # First handle traversals into and out of cascaded menus. + + if {[string equal $direction "right"]} { + set count 1 + set parent [winfo parent $menu] + set class [winfo class $parent] + if {[string equal [$menu type active] "cascade"]} { + $menu postcascade active + set m2 [$menu entrycget active -menu] + if {[string compare $m2 ""]} { + ::tk::MenuFirstEntry $m2 + } + return + } else { + set parent [winfo parent $menu] + while {[string compare $parent "."]} { + if {[string equal [winfo class $parent] "Menu"] \ + && [string equal [$parent cget -type] "menubar"]} { + tk_menuSetFocus $parent + ::tk::MenuNextEntry $parent 1 + return + } + set parent [winfo parent $parent] + } + } + } else { + set count -1 + set m2 [winfo parent $menu] + if {[string equal [winfo class $m2] "Menu"]} { + if {[string compare [$m2 cget -type] "menubar"]} { + $menu activate none + ::tk::GenerateMenuSelect $menu + tk_menuSetFocus $m2 + + # This code unposts any posted submenu in the parent. + $m2 postcascade none + + #set tmp [$m2 index active] + #$m2 activate none + #$m2 activate $tmp + return + } + } + } + + # Can't traverse into or out of a cascaded menu. Go to the next + # or previous menubutton, if that makes sense. + + set m2 [winfo parent $menu] + if {[string equal [winfo class $m2] "Menu"]} { + if {[string equal [$m2 cget -type] "menubar"]} { + tk_menuSetFocus $m2 + ::tk::MenuNextEntry $m2 -1 + return + } + } + + set w $::tk::Priv(postedMb) + if {[string equal $w ""]} { + return + } + set buttons [winfo children [winfo parent $w]] + set length [llength $buttons] + set i [expr {[lsearch -exact $buttons $w] + $count}] + while {1} { + while {$i < 0} { + incr i $length + } + while {$i >= $length} { + incr i -$length + } + set mb [lindex $buttons $i] + if {[string equal [winfo class $mb] "Menubutton"] \ + && [string compare [$mb cget -state] "disabled"] \ + && [string compare [$mb cget -menu] ""] \ + && [string compare [[$mb cget -menu] index last] "none"]} { + break + } + if {[string equal $mb $w]} { + return + } + incr i $count + } + ::tk::MbPost $mb + ::tk::MenuFirstEntry [$mb cget -menu] +} + +# ::tk::MenuFirstEntry -- +# Given a menu, this procedure finds the first entry that isn't +# disabled or a tear-off or separator, and activates that entry. +# However, if there is already an active entry in the menu (e.g., +# because of a previous call to ::tk::PostOverPoint) then the active +# entry isn't changed. This procedure also sets the input focus +# to the menu. +# +# Arguments: +# menu - Name of the menu window (possibly empty). + +proc ::tk::MenuFirstEntry menu { + if {[string equal $menu ""]} { + return + } + tk_menuSetFocus $menu + if {[string compare [$menu index active] "none"]} { + return + } + set last [$menu index last] + if {[string equal $last "none"]} { + return + } + for {set i 0} {$i <= $last} {incr i} { + if {([catch {set state [$menu entrycget $i -state]}] == 0) \ + && [string compare $state "disabled"]} { + #~$menu activate $i + #~::tk::GenerateMenuSelect $menu + # Only post the cascade if the current menu is a menubar; + # otherwise, if the first entry of the cascade is a cascade, + # we can get an annoying cascading effect resulting in a bunch of + # menus getting posted (bug 676) + if {[string equal [$menu type $i] "cascade"] && \ + [string equal [$menu cget -type] "menubar"]} { + set cascade [$menu entrycget $i -menu] + if {[string compare $cascade ""]} { + $menu postcascade $i + ::tk::MenuFirstEntry $cascade + } + } + return + } + } +} + +# ::tk::MenuMotion -- +# This procedure is called to handle mouse motion events for menus. +# It does two things. First, it resets the active element in the +# menu, if the mouse is over the menu. Second, if a mouse button +# is down, it posts and unposts cascade entries to match the mouse +# position. +# +# Arguments: +# menu - The menu window. +# x - The x position of the mouse. +# y - The y position of the mouse. +# state - Modifier state (tells whether buttons are down). + +proc ::tk::MenuMotion {menu x y state} { + global ::tk::Priv + if {$menu eq $::tk::Priv(window)} { + if {[$menu cget -type] eq "menubar"} { + if {[info exists ::tk::Priv(focus)] && $menu ne $::tk::Priv(focus)} { + $menu activate @$x,$y + ::tk::GenerateMenuSelect $menu + } + } else { + $menu activate @$x,$y + ::tk::GenerateMenuSelect $menu + } + } + #debugmsg plugins "MENU: $menu $::tk::Priv(activeMenu) $::tk::Priv(activeItem) $::tk::Priv(focus)" + if {([$menu cget -type] ne "menubar") || \ + ([info exist ::tk::Priv(focus)] && ($::tk::Priv(focus) ne "") && ($::tk::Priv(activeItem) != "none"))} { + myMenuPostCascade $menu + } +} + +# ::tk::MenuButtonDown -- +# Handles button presses in menus. There are a couple of tricky things +# here: +# 1. Change the posted cascade entry (if any) to match the mouse position. +# 2. If there is a posted menubutton, must grab to the menubutton; this +# overrrides the implicit grab on button press, so that the menu +# button can track mouse motions over other menubuttons and change +# the posted menu. +# 3. If there's no posted menubutton (e.g. because we're a torn-off menu +# or one of its descendants) must grab to the top-level menu so that +# we can track mouse motions across the entire menu hierarchy. +# +# Arguments: +# menu - The menu window. + +proc ::tk::MenuButtonDown menu { + variable ::tk::Priv + global tcl_platform + + if {![winfo viewable $menu]} { + return + } + $menu postcascade active + if {$Priv(postedMb) ne "" && [winfo viewable $Priv(postedMb)]} { + grab -global $Priv(postedMb) + } else { + while {[$menu cget -type] eq "normal" \ + && [winfo class [winfo parent $menu]] eq "Menu" \ + && [winfo ismapped [winfo parent $menu]]} { + set menu [winfo parent $menu] + } + + if {$Priv(menuBar) eq {}} { + set Priv(menuBar) $menu + set Priv(cursor) [$menu cget -cursor] + $menu configure -cursor arrow + } else { + $menu activate none + #MenuUnpost $menu + } + + # Don't update grab information if the grab window isn't changing. + # Otherwise, we'll get an error when we unpost the menus and + # restore the grab, since the old grab window will not be viewable + # anymore. + + if {$menu ne [grab current $menu]} { + SaveGrabInfo $menu + } + + # Must re-grab even if the grab window hasn't changed, in order + # to release the implicit grab from the button press. + + if {[tk windowingsystem] eq "x11"} { + grab -global $menu + } + } +} + +set myPriv(id) "" +set myPriv(delay) 170 +set myPriv(activeMenu) "" +set myPriv(activeItem) "" + +proc myMenuPostCascade {menu} { + global myPriv + + if {$myPriv(id) ne ""} { + if {($myPriv(activeMenu) == $menu) && ($myPriv(activeItem) == [$menu index active])} { + return + } else { + after cancel $myPriv(id) + } + } + if {[string equal [$menu cget -type] "menubar"]} { + $menu postcascade active + } else { + set myPriv(activeMenu) $menu + set myPriv(activeItem) [$menu index active] + set myPriv(id) [after $myPriv(delay) "$menu postcascade active"] + } +} + +} diff --git a/pysollib/games/fan.py b/pysollib/games/fan.py index 02fdf85e..f0005f85 100644 --- a/pysollib/games/fan.py +++ b/pysollib/games/fan.py @@ -588,12 +588,12 @@ class Troika(Fan): self.s.talon.dealRow(rows=[t], frames=4) -class TroikaPlus_RowStack(RK_RowStack): +class Quads_RowStack(RK_RowStack): def getBottomImage(self): return self.game.app.images.getReserveBottom() -class TroikaPlus(Troika): - RowStack_Class = StackWrapper(TroikaPlus_RowStack, dir=0, +class Quads(Troika): + RowStack_Class = StackWrapper(Quads_RowStack, dir=0, ##base_rank=NO_RANK, max_cards=4) def createGame(self): @@ -758,8 +758,8 @@ registerGame(GameInfo(385, BoxFan, "Box Fan", GI.GT_FAN_TYPE | GI.GT_OPEN, 1, 0, GI.SL_MOSTLY_SKILL)) registerGame(GameInfo(516, Troika, "Troika", GI.GT_FAN_TYPE | GI.GT_OPEN, 1, 0, GI.SL_MOSTLY_SKILL)) -registerGame(GameInfo(517, TroikaPlus, "Troika +", - GI.GT_FAN_TYPE | GI.GT_OPEN, 1, 0, GI.SL_MOSTLY_SKILL)) +registerGame(GameInfo(517, Quads, "Quads", + GI.GT_FAN_TYPE | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0, GI.SL_MOSTLY_SKILL)) registerGame(GameInfo(625, FascinationFan, "Fascination Fan", GI.GT_FAN_TYPE, 1, 6, GI.SL_BALANCED)) registerGame(GameInfo(647, Crescent, "Crescent", diff --git a/pysollib/init.py b/pysollib/init.py index d1c574df..9294ff01 100644 --- a/pysollib/init.py +++ b/pysollib/init.py @@ -23,6 +23,8 @@ import sys, os, locale import traceback import gettext +import settings + # /*********************************************************************** # // init # ************************************************************************/ @@ -50,27 +52,29 @@ def init(): gettext.install('pysol', locale_dir, unicode=True) ## init toolkit - import settings if '--gtk' in sys.argv: settings.TOOLKIT = 'gtk' sys.argv.remove('--gtk') - else: - if '--tile' in sys.argv: + elif '--tk' in sys.argv: + settings.TOOLKIT = 'tk' + settings.USE_TILE = False + sys.argv.remove('--tk') + elif '--tile' in sys.argv: + settings.TOOLKIT = 'tk' + settings.USE_TILE = True + sys.argv.remove('--tile') + elif settings.TOOLKIT == 'tk' and settings.USE_TILE == 'auto': + # check tile + import Tkinter + root = Tkinter.Tk() + root.withdraw() + settings.USE_TILE = False + try: + root.tk.call('package', 'require', 'tile', '0.7.8') + except: + pass + else: settings.USE_TILE = True - sys.argv.remove('--tile') - elif settings.USE_TILE == 'auto': - # check tile - import Tkinter - root = Tkinter.Tk() - root.withdraw() - settings.USE_TILE = False - try: - tile_version = root.tk.call('package', 'require', 'tile') - except: - pass - else: - if tile_version >= '0.7.8': - settings.USE_TILE = True - #root.destroy() - Tkinter._default_root = None + #root.destroy() + Tkinter._default_root = None diff --git a/pysollib/main.py b/pysollib/main.py index 5a7e8d0f..2026f297 100644 --- a/pysollib/main.py +++ b/pysollib/main.py @@ -43,7 +43,7 @@ import gettext # PySol imports from mfxutil import destruct, EnvError from util import CARDSET, DataLoader -from settings import PACKAGE, TOOLKIT, VERSION +from settings import PACKAGE, TOOLKIT, VERSION, SOUND_MOD from resource import Tile from gamedb import GI from app import Application @@ -243,29 +243,31 @@ def pysol_init(app, args): warn_thread = 0 warn_pysolsoundserver = 0 app.audio = None - if opts["nosound"]: + sounds = {'pss': PysolSoundServerModuleClient, + 'pygame': PyGameAudioClient, + 'oss': OSSAudioClient, + 'win': Win32AudioClient} + if opts["nosound"] or SOUND_MOD == 'none': app.audio = AbstractAudioClient() + elif opts['sound-mod']: + c = sounds[opts['sound-mod']] + app.audio = c() + elif SOUND_MOD == 'auto': + for c in (PysolSoundServerModuleClient, + PyGameAudioClient, + OSSAudioClient, + Win32AudioClient, + AbstractAudioClient): + try: + app.audio = c() + except: + pass + else: + # success + break else: - if opts['sound-mod']: - d = {'pss': PysolSoundServerModuleClient, - 'pygame': PyGameAudioClient, - 'oss': OSSAudioClient, - 'win': Win32AudioClient} - c = d[opts['sound-mod']] - app.audio = c() - else: - for c in (PysolSoundServerModuleClient, - PyGameAudioClient, - OSSAudioClient, - Win32AudioClient, - AbstractAudioClient): - try: - app.audio = c() - except: - pass - else: - # success - break + c = sounds[SOUND_MOD] + app.audio = c() app.audio.startServer() # update sound_mode if isinstance(app.audio, PysolSoundServerModuleClient): diff --git a/pysollib/pysolaudio.py b/pysollib/pysolaudio.py index 3363c625..2f977a76 100644 --- a/pysollib/pysolaudio.py +++ b/pysollib/pysolaudio.py @@ -390,11 +390,7 @@ class OSSAudioClient(AbstractAudioClient): def __init__(self): AbstractAudioClient.__init__(self) - try: - import ossaudiodev, wave - except: - if traceback: traceback.print_exc() - raise + import ossaudiodev, wave self.audiodev = ossaudiodev def startServer(self): @@ -430,18 +426,14 @@ class PyGameAudioClient(AbstractAudioClient): def __init__(self): AbstractAudioClient.__init__(self) - try: - import pygame.mixer, pygame.time - if os.name == 'nt': - # for py2exe - import pygame.base, pygame.rwobject, pygame.mixer_music - self.mixer = pygame.mixer - self.mixer.init() - self.music = self.mixer.music - self.time = pygame.time - except: - ##if traceback: traceback.print_exc() - raise + import pygame.mixer, pygame.time + if os.name == 'nt': + # for py2exe + import pygame.base, pygame.rwobject, pygame.mixer_music + self.mixer = pygame.mixer + self.mixer.init() + self.music = self.mixer.music + self.time = pygame.time self.audiodev = self.mixer self.sound = None self.sound_channel = None diff --git a/pysollib/pysolgtk/tkwidget.py b/pysollib/pysolgtk/tkwidget.py index 71d8f24d..1eece443 100644 --- a/pysollib/pysolgtk/tkwidget.py +++ b/pysollib/pysolgtk/tkwidget.py @@ -65,6 +65,8 @@ class _MyDialog(gtk.Dialog): class MfxDialog(_MyDialog): + img = {} + button_img = {} def __init__(self, parent, title='', timeout=0, resizable=0, diff --git a/pysollib/settings.py b/pysollib/settings.py index 1c6bcff8..25759f8a 100644 --- a/pysollib/settings.py +++ b/pysollib/settings.py @@ -23,7 +23,7 @@ import sys, os n_ = lambda x: x # for gettext -# + #PACKAGE = 'PySolFC' PACKAGE = 'PySol' PACKAGE_URL = 'http://sourceforge.net/projects/pysolfc/' @@ -37,6 +37,7 @@ USE_TILE = 'auto' # or True or False TILE_THEME = 'default' # name of tile's theme if os.name == 'nt': TILE_THEME = 'winnative' +SOUND_MOD = 'auto' # or 'pss', 'pygame', 'oss', 'win', 'none' # data dirs DATA_DIRS = [] diff --git a/pysollib/tile/tkutil.py b/pysollib/tile/tkutil.py index f7730ee9..4d87b4b5 100644 --- a/pysollib/tile/tkutil.py +++ b/pysollib/tile/tkutil.py @@ -414,6 +414,12 @@ def get_text_width(text, font, root=None): # ************************************************************************/ def load_theme(app, top, theme): + # + if os.name == 'posix': + f = os.path.join(app.dataloader.dir, 'tcl', 'menu8.4.tcl') + if os.path.exists(f): + top.tk.call('source', f) + # top.tk.call("package", "require", "tile") # load available themes d = os.path.join(app.dataloader.dir, 'themes') diff --git a/pysollib/tile/tkwidget.py b/pysollib/tile/tkwidget.py index ac70ae50..83b55a31 100644 --- a/pysollib/tile/tkwidget.py +++ b/pysollib/tile/tkwidget.py @@ -43,7 +43,7 @@ __all__ = ['MfxDialog', ] # imports -import os, sys, time, types +import os, sys, time, locale import Tkinter as Tk import Tile as Tkinter import traceback @@ -103,28 +103,7 @@ class MfxDialog: # ex. _ToplevelDialog def destroy(self): after_cancel(self.timer) unbind_destroy(self.top) - try: - self.top.wm_withdraw() - except: - if traceback: traceback.print_exc() - pass - try: - self.top.destroy() - except: - if traceback: traceback.print_exc() - pass - #destruct(self.top) - if 1 and self.parent: # ??? - try: - ##self.parent.update_idletasks() - # FIXME: why do we need this under Windows ? - if hasattr(self.parent, "busyUpdate"): - self.parent.busyUpdate() - else: - self.parent.update() - except: - if traceback: traceback.print_exc() - pass + self.top.destroy() self.top = None self.parent = None @@ -147,11 +126,18 @@ class MfxDialog: # ex. _ToplevelDialog def altKeyEvent(self, event): key = event.char - key = unicode(key, 'utf-8') - key = key.lower() - widget = self.accel_keys.get(key) - if not widget is None: - widget.event_generate('<>') + try: + if os.name == 'nt': + key = unicode(key, locale.getpreferredencoding()) + else: + key = unicode(key, 'utf-8') + except: + pass + else: + key = key.lower() + widget = self.accel_keys.get(key) + if not widget is None: + widget.event_generate('<>') def initKw(self, kw): kw = KwStruct(kw, @@ -196,12 +182,9 @@ class MfxDialog: # ex. _ToplevelDialog focus = None max_len = 0 for s in kw.strings: - if type(s) is types.TupleType: + if type(s) is tuple: s = s[0] if s: - ##s = re.sub(r"[\s\.\,]", "", s) - #if os.name == 'posix': - # s = s.replace('...', '.') s = s.replace('&', '') max_len = max(max_len, len(s)) ##print s, len(s) @@ -212,7 +195,7 @@ class MfxDialog: # ex. _ToplevelDialog # for s in kw.strings: xbutton = button = button + 1 - if type(s) is types.TupleType: + if type(s) is tuple: assert len(s) == 2 button = int(s[1]) s = s[0] @@ -228,7 +211,7 @@ class MfxDialog: # ex. _ToplevelDialog button = xbutton else: widget = Tkinter.Button(frame, text=s, default="normal", - command=(lambda self=self, button=button: self.mDone(button))) + command=(lambda self=self, button=button: self.mDone(button))) if button == kw.default: focus = widget focus.config(default="active") @@ -429,7 +412,7 @@ class MfxTooltip: class MfxScrolledCanvas: def __init__(self, parent, hbar=2, vbar=2, **kw): - kwdefault(kw, borderwidth=1, relief='sunken') + kwdefault(kw, highlightthickness=0, bd=1, relief='sunken') self.parent = parent self.createFrame(kw) self.canvas = None diff --git a/pysollib/tile/toolbar.py b/pysollib/tile/toolbar.py index d6d00d57..dd6ff8b0 100644 --- a/pysollib/tile/toolbar.py +++ b/pysollib/tile/toolbar.py @@ -76,16 +76,17 @@ class AbstractToolbarButton: if self.visible and not force: return self.visible = True - padx, pady = 2, 2 if orient == Tkinter.HORIZONTAL: + padx, pady = 0, 2 self.grid(row=0, column=self.position, - ipadx=padx, ipady=pady, + padx=padx, pady=pady, sticky='nsew') else: + padx, pady = 2, 0 self.grid(row=self.position, column=0, - ipadx=padx, ipady=pady, + padx=padx, pady=pady, sticky='nsew') def hide(self): @@ -273,9 +274,10 @@ class PysolToolbar(PysolToolbarActions): # Change the look of the frame to match the platform look # (see also setRelief) if os.name == 'posix': + ##self.frame.config(bd=1, relief=self.frame_relief) pass elif os.name == "nt": - self.frame.config(relief=self.frame_relief) + self.frame.config(bd=2, relief=self.frame_relief, padx=2, pady=2) else: pass @@ -323,7 +325,7 @@ class PysolToolbar(PysolToolbarActions): self.frame_relief = 'groove' else: self.frame_relief = 'raised' - self.separator_relief = 'sunken' #'raised' + self.separator_relief = 'sunken' if os.name == 'nt': self.frame_relief = 'groove' self.separator_relief = 'groove' @@ -373,7 +375,6 @@ class PysolToolbar(PysolToolbarActions): name = label.lower() image = self._loadImage(name) position = len(self._widgets) - bd = self.button_relief == 'flat' and 1 or 2 kw = { 'position' : position, 'toolbar' : self, @@ -381,20 +382,10 @@ class PysolToolbar(PysolToolbarActions): 'command' : command, 'takefocus' : 0, 'text' : gettext(label), - 'bd' : bd, - 'relief' : self.button_relief, - 'padx' : self.button_pad, - 'pady' : self.button_pad } - if Tkinter.TkVersion >= 8.4: - kw['overrelief'] = 'raised' if image: kw['image'] = image if check: - if Tkinter.TkVersion >= 8.4: - kw['offrelief'] = self.button_relief - kw['indicatoron'] = False - kw['selectcolor'] = '' button = ToolbarCheckbutton(self.frame, **kw) else: button = ToolbarButton(self.frame, **kw)