From e401d6a28e2d34b2a1c0e88f1511e6729f762aec Mon Sep 17 00:00:00 2001 From: skomoroh Date: Sat, 7 Oct 2006 21:13:04 +0000 Subject: [PATCH] * improved tile support * misc. bugs fixes git-svn-id: https://pysolfc.svn.sourceforge.net/svnroot/pysolfc/PySolFC/trunk@80 39dd0a4e-7c14-0410-91b3-c4f2d318f732 --- po/games.pot | 26 ++- po/pysol.pot | 106 +++++------ po/ru_games.po | 30 +++- po/ru_pysol.po | 104 +++++------ pysollib/games/bakersdozen.py | 13 +- pysollib/main.py | 35 ++-- pysollib/tile/Tile.py | 15 +- pysollib/tile/statusbar.py | 7 +- pysollib/tile/tkhtml.py | 1 + pysollib/tile/tkstats.py | 327 ++++++++++------------------------ pysollib/tile/tkutil.py | 7 + 11 files changed, 289 insertions(+), 382 deletions(-) diff --git a/po/games.pot b/po/games.pot index a75bbdcd..ce537ad9 100644 --- a/po/games.pot +++ b/po/games.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PySol 0.0.1\n" -"POT-Creation-Date: Thu Sep 21 15:56:22 2006\n" +"POT-Creation-Date: Sat Oct 7 20:02:33 2006\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -576,6 +576,9 @@ msgstr "" msgid "Congress" msgstr "" +msgid "Constitution" +msgstr "" + msgid "Contradance" msgstr "" @@ -723,6 +726,9 @@ msgstr "" msgid "Dojouji's Game Doubled" msgstr "" +msgid "Dolphin" +msgstr "" + msgid "Doorway" msgstr "" @@ -738,6 +744,9 @@ msgstr "" msgid "Double Cockroach" msgstr "" +msgid "Double Dolphin" +msgstr "" + msgid "Double Dot" msgstr "" @@ -3132,6 +3141,9 @@ msgstr "" msgid "Spanish Patience" msgstr "" +msgid "Spanish Patience II" +msgstr "" + msgid "Sphere" msgstr "" @@ -3342,6 +3354,12 @@ msgstr "" msgid "The Great Wall" msgstr "" +msgid "The Last Monarch" +msgstr "" + +msgid "The Last Monarch II" +msgstr "" + msgid "The Little Corporal" msgstr "" @@ -3354,9 +3372,6 @@ msgstr "" msgid "The Wish (open)" msgstr "" -msgid "The last Monarch" -msgstr "" - msgid "Theater" msgstr "" @@ -3669,6 +3684,9 @@ msgstr "" msgid "Zeus" msgstr "" +msgid "Zigzag Course" +msgstr "" + msgid "Zodiac" msgstr "" diff --git a/po/pysol.pot b/po/pysol.pot index 8434726c..df025155 100644 --- a/po/pysol.pot +++ b/po/pysol.pot @@ -14,7 +14,7 @@ msgid "" msgstr "" "#-#-#-#-# pysol-1.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: Thu Sep 21 15:57:22 2006\n" +"POT-Creation-Date: Sat Oct 7 20:03:30 2006\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -24,7 +24,7 @@ msgstr "" "Generated-By: pygettext.py 1.5\n" "#-#-#-#-# pysol-2.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2006-09-21 15:57+0400\n" +"POT-Creation-Date: 2006-10-07 20:03+0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -69,8 +69,8 @@ msgid "&Next number" msgstr "" #: pysollib/actions.py:316 pysollib/app.py:1150 pysollib/app.py:1162 -#: pysollib/game.py:925 pysollib/game.py:1861 pysollib/main.py:460 -#: pysollib/main.py:468 pysollib/tk/colorsdialog.py:122 +#: pysollib/game.py:925 pysollib/game.py:1861 pysollib/main.py:478 +#: pysollib/main.py:486 pysollib/tk/colorsdialog.py:122 #: pysollib/tk/edittextdialog.py:82 pysollib/tk/fontsdialog.py:143 #: pysollib/tk/fontsdialog.py:205 pysollib/tk/gameinfodialog.py:155 #: pysollib/tk/playeroptionsdialog.py:85 @@ -422,31 +422,31 @@ msgid "" "This won't come out...\n" msgstr "" -#: pysollib/game.py:2298 +#: pysollib/game.py:2291 msgid "Set bookmark" msgstr "" -#: pysollib/game.py:2299 +#: pysollib/game.py:2292 msgid "Replace existing bookmark %d ?" msgstr "" -#: pysollib/game.py:2321 +#: pysollib/game.py:2314 msgid "Goto bookmark" msgstr "" -#: pysollib/game.py:2322 +#: pysollib/game.py:2315 msgid "Goto bookmark %d ?" msgstr "" -#: pysollib/game.py:2353 +#: pysollib/game.py:2346 msgid "Open game" msgstr "" -#: pysollib/game.py:2364 pysollib/game.py:2373 pysollib/game.py:2378 +#: pysollib/game.py:2357 pysollib/game.py:2366 pysollib/game.py:2371 msgid "Load game error" msgstr "" -#: pysollib/game.py:2365 +#: pysollib/game.py:2358 msgid "" "Error while loading game.\n" "\n" @@ -454,22 +454,22 @@ msgid "" "but this could also be a bug you might want to report." msgstr "" -#: pysollib/game.py:2374 +#: pysollib/game.py:2367 msgid "Error while loading game" msgstr "" -#: pysollib/game.py:2379 +#: pysollib/game.py:2372 msgid "" "Internal error while loading game.\n" "\n" "Please report this bug." msgstr "" -#: pysollib/game.py:2404 +#: pysollib/game.py:2397 msgid "Save game error" msgstr "" -#: pysollib/game.py:2405 +#: pysollib/game.py:2398 msgid "Error while saving game" msgstr "" @@ -683,7 +683,7 @@ msgstr "" #: pysollib/games/auldlangsyne.py:158 pysollib/games/calculation.py:104 #: pysollib/games/numerica.py:90 pysollib/games/numerica.py:272 -#: pysollib/games/numerica.py:639 pysollib/games/numerica.py:743 +#: pysollib/games/numerica.py:639 pysollib/games/numerica.py:752 msgid "Tableau. Build regardless of rank and suit." msgstr "" @@ -710,12 +710,12 @@ msgid "" msgstr "" #: pysollib/games/canfield.py:528 pysollib/games/special/tarock.py:224 -#: pysollib/stack.py:1410 pysollib/util.py:80 +#: pysollib/stack.py:1409 pysollib/util.py:80 msgid "King" msgstr "" #: pysollib/games/canfield.py:531 pysollib/games/special/tarock.py:224 -#: pysollib/stack.py:1409 pysollib/util.py:80 +#: pysollib/stack.py:1408 pysollib/util.py:80 msgid "Queen" msgstr "" @@ -744,11 +744,15 @@ msgstr "" msgid "Balance $%d" msgstr "" -#: pysollib/games/klondike.py:439 +#: pysollib/games/klondike.py:172 pysollib/stack.py:2115 +msgid "Tableau. Build down by color." +msgstr "" + +#: pysollib/games/klondike.py:441 msgid "Reserve. Only Kings are acceptable." msgstr "" -#: pysollib/games/larasgame.py:163 pysollib/stack.py:1626 +#: pysollib/games/larasgame.py:163 pysollib/stack.py:1625 msgid "Round %d" msgstr "" @@ -851,7 +855,7 @@ msgstr "" #: pysollib/games/special/tarock.py:223 #: pysollib/games/ultra/dashavatara.py:351 #: pysollib/games/ultra/hexadeck.py:273 pysollib/games/ultra/mughal.py:254 -#: pysollib/stack.py:1411 pysollib/util.py:79 +#: pysollib/stack.py:1410 pysollib/util.py:79 msgid "Ace" msgstr "" @@ -1231,7 +1235,7 @@ msgstr "" msgid " Help" msgstr "" -#: pysollib/main.py:67 pysollib/main.py:368 +#: pysollib/main.py:67 pysollib/main.py:386 msgid " installation error" msgstr "" @@ -1245,17 +1249,17 @@ msgid "" "Please check your %s installation.\n" msgstr "" -#: pysollib/main.py:75 pysollib/main.py:376 pysollib/tk/menubar.py:382 +#: pysollib/main.py:75 pysollib/main.py:394 pysollib/tk/menubar.py:382 msgid "&Quit" msgstr "" -#: pysollib/main.py:98 +#: pysollib/main.py:99 msgid "" "%s: %s\n" "try %s --help for more information" msgstr "" -#: pysollib/main.py:139 +#: pysollib/main.py:143 msgid "" "Usage: %s [OPTIONS] [FILE]\n" " -g --game=GAMENAME start game GAMENAME\n" @@ -1273,19 +1277,19 @@ msgid "" " MOD - one of following: pss(default), pygame, oss, win\n" msgstr "" -#: pysollib/main.py:157 +#: pysollib/main.py:161 msgid "" "%s: too many files\n" "try %s --help for more information" msgstr "" -#: pysollib/main.py:161 +#: pysollib/main.py:165 msgid "" "%s: invalid file name\n" "try %s --help for more information" msgstr "" -#: pysollib/main.py:369 +#: pysollib/main.py:387 msgid "" "\n" "No games were found !!!\n" @@ -1296,25 +1300,25 @@ msgid "" "Please check your %s installation.\n" msgstr "" -#: pysollib/main.py:455 pysollib/main.py:463 +#: pysollib/main.py:473 pysollib/main.py:481 msgid " installation problem" msgstr "" -#: pysollib/main.py:456 +#: pysollib/main.py:474 msgid "" "Your Python installation is compiled without thread support.\n" "\n" "Sounds and background music will be disabled." msgstr "" -#: pysollib/main.py:464 +#: pysollib/main.py:482 msgid "" "The pysolsoundserver module was not found.\n" "\n" "Sounds and background music will be disabled." msgstr "" -#: pysollib/main.py:471 +#: pysollib/main.py:489 msgid "Welcome to " msgstr "" @@ -1582,71 +1586,71 @@ msgstr "" msgid "USA" msgstr "" -#: pysollib/settings.py:54 data/glade-translations:29 +#: pysollib/settings.py:55 data/glade-translations:29 msgid "Top 10" msgstr "" -#: pysollib/stack.py:1405 +#: pysollib/stack.py:1404 msgid "Base card - %s." msgstr "" -#: pysollib/stack.py:1406 +#: pysollib/stack.py:1405 msgid "Empty row cannot be filled." msgstr "" -#: pysollib/stack.py:1407 +#: pysollib/stack.py:1406 msgid "any card" msgstr "" -#: pysollib/stack.py:1408 pysollib/util.py:80 +#: pysollib/stack.py:1407 pysollib/util.py:80 msgid "Jack" msgstr "" -#: pysollib/stack.py:1421 +#: pysollib/stack.py:1420 msgid "No cards" msgstr "" -#: pysollib/stack.py:1422 +#: pysollib/stack.py:1421 msgid "1 card" msgstr "" -#: pysollib/stack.py:1423 +#: pysollib/stack.py:1422 msgid " cards" msgstr "" -#: pysollib/stack.py:1635 pysollib/stack.py:1637 pysollib/stack.py:1673 +#: pysollib/stack.py:1634 pysollib/stack.py:1636 pysollib/stack.py:1672 msgid "Redeal" msgstr "" -#: pysollib/stack.py:1637 +#: pysollib/stack.py:1636 msgid "Stop" msgstr "" -#: pysollib/stack.py:1698 +#: pysollib/stack.py:1697 msgid "Variable redeals." msgstr "" -#: pysollib/stack.py:1699 +#: pysollib/stack.py:1698 msgid "Unlimited redeals." msgstr "" -#: pysollib/stack.py:1700 +#: pysollib/stack.py:1699 msgid "No redeals." msgstr "" -#: pysollib/stack.py:1701 +#: pysollib/stack.py:1700 msgid "One redeal." msgstr "" -#: pysollib/stack.py:1702 +#: pysollib/stack.py:1701 msgid " redeals." msgstr "" -#: pysollib/stack.py:1704 +#: pysollib/stack.py:1703 msgid "Talon." msgstr "" -#: pysollib/stack.py:1938 pysollib/stack.py:2388 +#: pysollib/stack.py:1937 pysollib/stack.py:2388 msgid "Reserve. No building." msgstr "" @@ -1696,10 +1700,6 @@ msgstr "" msgid "Tableau. Build up by color." msgstr "" -#: pysollib/stack.py:2115 -msgid "Tableau. Build down by color." -msgstr "" - #: pysollib/stack.py:2123 msgid "Tableau. Build up by suit." msgstr "" diff --git a/po/ru_games.po b/po/ru_games.po index 3558ae23..a8361fb1 100644 --- a/po/ru_games.po +++ b/po/ru_games.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: PySol 0.0.1\n" -"POT-Creation-Date: Thu Sep 21 15:56:22 2006\n" -"PO-Revision-Date: 2006-09-30 18:19+0400\n" +"POT-Creation-Date: Sat Oct 7 20:02:33 2006\n" +"PO-Revision-Date: 2006-10-07 20:10+0400\n" "Last-Translator: Скоморох \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" @@ -580,6 +580,9 @@ msgstr "Конус" msgid "Congress" msgstr "Конгресс" +msgid "Constitution" +msgstr "Конституция" + msgid "Contradance" msgstr "Контрданс" @@ -728,6 +731,9 @@ msgstr "" msgid "Dojouji's Game Doubled" msgstr "" +msgid "Dolphin" +msgstr "Дельфин" + msgid "Doorway" msgstr "Вход" @@ -743,6 +749,9 @@ msgstr "Двойной Кенфилд" msgid "Double Cockroach" msgstr "Двойной таракан" +msgid "Double Dolphin" +msgstr "Двойной Дельфин" + msgid "Double Dot" msgstr "Двоеточие" @@ -3185,6 +3194,9 @@ msgstr "Промежутки и тузы" msgid "Spanish Patience" msgstr "Испанский пасьянс" +msgid "Spanish Patience II" +msgstr "Испанский пасьянс II" + msgid "Sphere" msgstr "Сфера" @@ -3402,6 +3414,14 @@ msgstr "Сад" msgid "The Great Wall" msgstr "Великая Стена" +#, fuzzy +msgid "The Last Monarch" +msgstr "Последний Монарх" + +#, fuzzy +msgid "The Last Monarch II" +msgstr "Последний Монарх" + msgid "The Little Corporal" msgstr "Маленький Капрал" @@ -3414,9 +3434,6 @@ msgstr "Желание" msgid "The Wish (open)" msgstr "Желание (открытое)" -msgid "The last Monarch" -msgstr "Последний Монарх" - msgid "Theater" msgstr "Театр" @@ -3745,6 +3762,9 @@ msgstr "Церлин (3 колоды)" msgid "Zeus" msgstr "Зевс" +msgid "Zigzag Course" +msgstr "" + msgid "Zodiac" msgstr "Зодиак" diff --git a/po/ru_pysol.po b/po/ru_pysol.po index 082f7a96..16810ff2 100644 --- a/po/ru_pysol.po +++ b/po/ru_pysol.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PySol 0.0.1\n" -"POT-Creation-Date: Thu Sep 21 15:57:22 2006\n" +"POT-Creation-Date: Sat Oct 7 20:03:30 2006\n" "PO-Revision-Date: 2006-10-05 16:31+0400\n" "Last-Translator: Скоморох \n" "Language-Team: Russian \n" @@ -54,8 +54,8 @@ msgid "&Next number" msgstr "&Следующий номер" #: pysollib/actions.py:316 pysollib/app.py:1150 pysollib/app.py:1162 -#: pysollib/game.py:925 pysollib/game.py:1861 pysollib/main.py:460 -#: pysollib/main.py:468 pysollib/tk/colorsdialog.py:122 +#: pysollib/game.py:925 pysollib/game.py:1861 pysollib/main.py:478 +#: pysollib/main.py:486 pysollib/tk/colorsdialog.py:122 #: pysollib/tk/edittextdialog.py:82 pysollib/tk/fontsdialog.py:143 #: pysollib/tk/fontsdialog.py:205 pysollib/tk/gameinfodialog.py:155 #: pysollib/tk/playeroptionsdialog.py:85 @@ -460,31 +460,31 @@ msgstr "" "\n" "Не удалось...\n" -#: pysollib/game.py:2298 +#: pysollib/game.py:2291 msgid "Set bookmark" msgstr "Установить закладку" -#: pysollib/game.py:2299 +#: pysollib/game.py:2292 msgid "Replace existing bookmark %d ?" msgstr "Заменить существующую закладку %d ?" -#: pysollib/game.py:2321 +#: pysollib/game.py:2314 msgid "Goto bookmark" msgstr "Перейти к закладке" -#: pysollib/game.py:2322 +#: pysollib/game.py:2315 msgid "Goto bookmark %d ?" msgstr "Перейти к закладке %d ?" -#: pysollib/game.py:2353 +#: pysollib/game.py:2346 msgid "Open game" msgstr "Открыть игру" -#: pysollib/game.py:2364 pysollib/game.py:2373 pysollib/game.py:2378 +#: pysollib/game.py:2357 pysollib/game.py:2366 pysollib/game.py:2371 msgid "Load game error" msgstr "Ошибка при загрузке игры" -#: pysollib/game.py:2365 +#: pysollib/game.py:2358 msgid "" "Error while loading game.\n" "\n" @@ -496,11 +496,11 @@ msgstr "" "Возможно повреждён файл,\n" "или ошибка в программе." -#: pysollib/game.py:2374 +#: pysollib/game.py:2367 msgid "Error while loading game" msgstr "Ошибка при загрузке игры" -#: pysollib/game.py:2379 +#: pysollib/game.py:2372 msgid "" "Internal error while loading game.\n" "\n" @@ -510,11 +510,11 @@ msgstr "" "\n" "Пожалуйста сообщите об этой ошибке." -#: pysollib/game.py:2404 +#: pysollib/game.py:2397 msgid "Save game error" msgstr "Ошибка при сохранении игры" -#: pysollib/game.py:2405 +#: pysollib/game.py:2398 msgid "Error while saving game" msgstr "Ошибка при сохранении игры" @@ -728,7 +728,7 @@ msgstr "Пазлы" #: pysollib/games/auldlangsyne.py:158 pysollib/games/calculation.py:104 #: pysollib/games/numerica.py:90 pysollib/games/numerica.py:272 -#: pysollib/games/numerica.py:639 pysollib/games/numerica.py:743 +#: pysollib/games/numerica.py:639 pysollib/games/numerica.py:752 msgid "Tableau. Build regardless of rank and suit." msgstr "Игровой стол. Складывать не считаясь с мастью и достоинством." @@ -759,12 +759,12 @@ msgstr "" "4: 8 Д 3 7 В 2 6 10 Т 5 9 К" #: pysollib/games/canfield.py:528 pysollib/games/special/tarock.py:224 -#: pysollib/stack.py:1410 pysollib/util.py:80 +#: pysollib/stack.py:1409 pysollib/util.py:80 msgid "King" msgstr "Король" #: pysollib/games/canfield.py:531 pysollib/games/special/tarock.py:224 -#: pysollib/stack.py:1409 pysollib/util.py:80 +#: pysollib/stack.py:1408 pysollib/util.py:80 msgid "Queen" msgstr "Королева" @@ -794,11 +794,15 @@ msgstr "Базовая ячейка. Складывать по возраста msgid "Balance $%d" msgstr "Баланс $%d" -#: pysollib/games/klondike.py:439 +#: pysollib/games/klondike.py:172 pysollib/stack.py:2115 +msgid "Tableau. Build down by color." +msgstr "Игровой стол. Складывать по убыванию в соответствии с цветом." + +#: pysollib/games/klondike.py:441 msgid "Reserve. Only Kings are acceptable." msgstr "Резерв. Только для королей." -#: pysollib/games/larasgame.py:163 pysollib/stack.py:1626 +#: pysollib/games/larasgame.py:163 pysollib/stack.py:1625 msgid "Round %d" msgstr "Раунд %d" @@ -927,7 +931,7 @@ msgstr "Жезлы" #: pysollib/games/special/tarock.py:223 #: pysollib/games/ultra/dashavatara.py:351 #: pysollib/games/ultra/hexadeck.py:273 pysollib/games/ultra/mughal.py:254 -#: pysollib/stack.py:1411 pysollib/util.py:79 +#: pysollib/stack.py:1410 pysollib/util.py:79 msgid "Ace" msgstr "Туз" @@ -1335,7 +1339,7 @@ msgstr "Не найден файл помощи\n" msgid " Help" msgstr " Помощь" -#: pysollib/main.py:67 pysollib/main.py:368 +#: pysollib/main.py:67 pysollib/main.py:386 msgid " installation error" msgstr " проблема с установкой" @@ -1349,11 +1353,11 @@ msgid "" "Please check your %s installation.\n" msgstr "" -#: pysollib/main.py:75 pysollib/main.py:376 pysollib/tk/menubar.py:382 +#: pysollib/main.py:75 pysollib/main.py:394 pysollib/tk/menubar.py:382 msgid "&Quit" msgstr "В&ыход" -#: pysollib/main.py:98 +#: pysollib/main.py:99 msgid "" "%s: %s\n" "try %s --help for more information" @@ -1361,7 +1365,7 @@ msgstr "" "%s: %s\n" "попробуйте %s --help для получения более подробной информации" -#: pysollib/main.py:139 +#: pysollib/main.py:143 #, fuzzy msgid "" "Usage: %s [OPTIONS] [FILE]\n" @@ -1390,7 +1394,7 @@ msgstr "" "\n" " FILE - имя файла сохранённой игры\n" -#: pysollib/main.py:157 +#: pysollib/main.py:161 msgid "" "%s: too many files\n" "try %s --help for more information" @@ -1398,7 +1402,7 @@ msgstr "" "\"%s: слишком много файлов\n" "попробуйте %s --help для получения более подробной информации" -#: pysollib/main.py:161 +#: pysollib/main.py:165 msgid "" "%s: invalid file name\n" "try %s --help for more information" @@ -1406,7 +1410,7 @@ msgstr "" "%s: неправильное имя файла\n" "попробуйте %s --help для получения более подробной информации" -#: pysollib/main.py:369 +#: pysollib/main.py:387 msgid "" "\n" "No games were found !!!\n" @@ -1417,18 +1421,18 @@ msgid "" "Please check your %s installation.\n" msgstr "" -#: pysollib/main.py:455 pysollib/main.py:463 +#: pysollib/main.py:473 pysollib/main.py:481 msgid " installation problem" msgstr "" -#: pysollib/main.py:456 +#: pysollib/main.py:474 msgid "" "Your Python installation is compiled without thread support.\n" "\n" "Sounds and background music will be disabled." msgstr "" -#: pysollib/main.py:464 +#: pysollib/main.py:482 msgid "" "The pysolsoundserver module was not found.\n" "\n" @@ -1438,7 +1442,7 @@ msgstr "" "\n" "Звук и фоновая музыка будут недоступны" -#: pysollib/main.py:471 +#: pysollib/main.py:489 msgid "Welcome to " msgstr "Добро пожаловать в " @@ -1707,71 +1711,71 @@ msgstr "Швейцария" msgid "USA" msgstr "США" -#: pysollib/settings.py:54 data/glade-translations:29 +#: pysollib/settings.py:55 data/glade-translations:29 msgid "Top 10" msgstr "Top 10" -#: pysollib/stack.py:1405 +#: pysollib/stack.py:1404 msgid "Base card - %s." msgstr "Базовая карта - %s." -#: pysollib/stack.py:1406 +#: pysollib/stack.py:1405 msgid "Empty row cannot be filled." msgstr "Пустой ряд не заполняется." -#: pysollib/stack.py:1407 +#: pysollib/stack.py:1406 msgid "any card" msgstr "любая карта" -#: pysollib/stack.py:1408 pysollib/util.py:80 +#: pysollib/stack.py:1407 pysollib/util.py:80 msgid "Jack" msgstr "Валет" -#: pysollib/stack.py:1421 +#: pysollib/stack.py:1420 msgid "No cards" msgstr "Нет карт" -#: pysollib/stack.py:1422 +#: pysollib/stack.py:1421 msgid "1 card" msgstr "1 карта" -#: pysollib/stack.py:1423 +#: pysollib/stack.py:1422 msgid " cards" msgstr " карт" -#: pysollib/stack.py:1635 pysollib/stack.py:1637 pysollib/stack.py:1673 +#: pysollib/stack.py:1634 pysollib/stack.py:1636 pysollib/stack.py:1672 msgid "Redeal" msgstr "Сдать" -#: pysollib/stack.py:1637 +#: pysollib/stack.py:1636 msgid "Stop" msgstr "Стоп" -#: pysollib/stack.py:1698 +#: pysollib/stack.py:1697 msgid "Variable redeals." msgstr "Переменное количество пересдач." -#: pysollib/stack.py:1699 +#: pysollib/stack.py:1698 msgid "Unlimited redeals." msgstr "Неограниченное количество пересдач." -#: pysollib/stack.py:1700 +#: pysollib/stack.py:1699 msgid "No redeals." msgstr "Без пересдачи." -#: pysollib/stack.py:1701 +#: pysollib/stack.py:1700 msgid "One redeal." msgstr "1 пересдача." -#: pysollib/stack.py:1702 +#: pysollib/stack.py:1701 msgid " redeals." msgstr " пересдачи." -#: pysollib/stack.py:1704 +#: pysollib/stack.py:1703 msgid "Talon." msgstr "Колода." -#: pysollib/stack.py:1938 pysollib/stack.py:2388 +#: pysollib/stack.py:1937 pysollib/stack.py:2388 msgid "Reserve. No building." msgstr "Резерв. Без выкладывания." @@ -1821,10 +1825,6 @@ msgstr "Игровой стол. Складывать в соответстви msgid "Tableau. Build up by color." msgstr "Игровой стол. Складывать по возрастанию в соответствии с цветом." -#: pysollib/stack.py:2115 -msgid "Tableau. Build down by color." -msgstr "Игровой стол. Складывать по убыванию в соответствии с цветом." - #: pysollib/stack.py:2123 msgid "Tableau. Build up by suit." msgstr "Игровой стол. Складывать по возрастанию в соответствии с мастью." diff --git a/pysollib/games/bakersdozen.py b/pysollib/games/bakersdozen.py index 3f8142f7..9feb0269 100644 --- a/pysollib/games/bakersdozen.py +++ b/pysollib/games/bakersdozen.py @@ -143,18 +143,21 @@ class BakersDozen(CastlesInSpain): # /*********************************************************************** # // Spanish Patience +# // Portuguese Solitaire # ************************************************************************/ class SpanishPatience(BakersDozen): Foundation_Class = AC_FoundationStack -# /*********************************************************************** -# // Portuguese Solitaire -# ************************************************************************/ - class PortugueseSolitaire(BakersDozen): RowStack_Class = StackWrapper(RK_RowStack, base_rank=KING) + def _shuffleHook(self, cards): + return cards + + +class SpanishPatienceII(PortugueseSolitaire): + RowStack_Class = RK_RowStack # /*********************************************************************** @@ -347,3 +350,5 @@ registerGame(GameInfo(369, RippleFan, "Ripple Fan", GI.GT_BAKERS_DOZEN, 1, -1, GI.SL_MOSTLY_SKILL)) registerGame(GameInfo(515, Indefatigable, "Indefatigable", GI.GT_BAKERS_DOZEN | GI.GT_OPEN, 1, 2, GI.SL_MOSTLY_SKILL)) +registerGame(GameInfo(664, SpanishPatienceII, "Spanish Patience II", + GI.GT_BAKERS_DOZEN | GI.GT_OPEN, 1, 0, GI.SL_MOSTLY_SKILL)) diff --git a/pysollib/main.py b/pysollib/main.py index 908e31a8..ccb8b807 100644 --- a/pysollib/main.py +++ b/pysollib/main.py @@ -242,15 +242,6 @@ def pysol_init(app, args): app.top_bg = top.cget("bg") app.top_palette = [None, None] # [fg, bg] app.top_cursor = top.cget("cursor") - if USE_TILE: - import settings - if opts['tile-theme']: - settings.TILE_THEME = opts['tile-theme'] - from pysoltk import load_theme - try: - load_theme(app, top, settings.TILE_THEME) - except Exception, err: - print >> sys.stderr, 'ERROR: set theme:', err # load options app.loadOptions() @@ -374,22 +365,20 @@ def pysol_init(app, args): app.opt.fonts["default"] = None if USE_TILE: # for tile + from pysoltk import load_theme + import settings + if opts['tile-theme']: + settings.TILE_THEME = opts['tile-theme'] + try: + load_theme(app, top, settings.TILE_THEME) + except Exception, err: + print >> sys.stderr, 'ERROR: set theme:', err ##top.option_add('*Toolbar.relief', 'groove') ##top.option_add('*Toolbar.relief', 'raised') - top.option_add('*Toolbar.borderWidth', 1) - top.option_add('*Toolbar.Button.Pad', 2) - top.option_add('*Toolbar.Button.default', 'disabled') - top.option_add('*Toolbar*takeFocus', 0) - # - from settings import TILE_THEME - if TILE_THEME: - if font: - top.tk.call('style', 'configure', '.', '-font', font) - else: - font = top.tk.call('style', 'lookup', TILE_THEME, '-font') - top.option_add('*font', font) - bg = top.tk.call('style', 'lookup', TILE_THEME, '-background') - top.tk_setPalette(bg) + ##top.option_add('*Toolbar.borderWidth', 1) + ##top.option_add('*Toolbar.Button.Pad', 2) + ##top.option_add('*Toolbar.Button.default', 'disabled') + ##top.option_add('*Toolbar*takeFocus', 0) # check games if len(app.gdb.getGamesIdSortedByName()) == 0: diff --git a/pysollib/tile/Tile.py b/pysollib/tile/Tile.py index 0ff0b8be..440d83b1 100644 --- a/pysollib/tile/Tile.py +++ b/pysollib/tile/Tile.py @@ -23,6 +23,10 @@ TkVersion = Tkinter.TkVersion TclError = Tkinter.TclError +# internal +_flatten = Tkinter._flatten + + class Style: def __init__(self, master): self.tk = master.tk @@ -84,7 +88,7 @@ class Style: for k, v in cnf.items(): if v is not None: if k[-1] == '_': k = k[:-1] - res = res + ('-'+k, v) + res = res + ('-'+k, str(v)) return res def configure(self, style, **kw): @@ -372,7 +376,7 @@ class Treeview(Widget, Tkinter.Listbox): The width of the column in pixels. Default is something reasonable, probably 200 or so. """ - pass + return self.tk.call((self._w, 'column', column) + self._options(kw)) def delete(self, items): """Deletes each of the items and all of their descendants. @@ -413,7 +417,7 @@ class Treeview(Widget, Tkinter.Listbox): -command script A script to evaluate when the heading label is pressed. """ - pass + return self.tk.call((self._w, 'heading', column) + self._options(kw)) def identify(self, x, y): """Returns a description of the widget component under the point given @@ -458,7 +462,10 @@ class Treeview(Widget, Tkinter.Listbox): returns the item identifier of the newly created item. See ITEM OPTIONS for the list of available options. """ - pass + if not parent: parent = '' + args = (self._w, 'insert', parent, index) + if id: args = args + ('-id', id) + return self.tk.call(args + self._options(kw)) def item(item, **kw): """Query or modify the options for the specified item. If no -option diff --git a/pysollib/tile/statusbar.py b/pysollib/tile/statusbar.py index dffb1b9f..e3abc65c 100644 --- a/pysollib/tile/statusbar.py +++ b/pysollib/tile/statusbar.py @@ -120,6 +120,7 @@ class MfxStatusbar: def configLabel(self, name, **kw): if kw.has_key('fg'): + kw['foreground'] = kw['fg'] del kw['fg'] label = getattr(self, name + "_label") apply(label.config, (), kw) @@ -165,21 +166,21 @@ class PysolStatusbar(MfxStatusbar): # l = self._createLabel("info", fill='both', expand=1) ##l.config(text="", justify="left", anchor='w') - #~l.config(padx=8) + l.config(padding=(8, 0)) class HelpStatusbar(MfxStatusbar): def __init__(self, top): MfxStatusbar.__init__(self, top, row=4, column=0, columnspan=3) l = self._createLabel("info", fill='both', expand=1) - l.config(justify="left", anchor='w') #~, padx=8) + l.config(justify="left", anchor='w', padding=(8, 0)) class HtmlStatusbar(MfxStatusbar): def __init__(self, top, row, column, columnspan): MfxStatusbar.__init__(self, top, row=row, column=column, columnspan=columnspan) l = self._createLabel("url", fill='both', expand=1) - l.config(justify="left", anchor='w') #~, padx=8) + l.config(justify="left", anchor='w', padding=(8, 0)) # /*********************************************************************** diff --git a/pysollib/tile/tkhtml.py b/pysollib/tile/tkhtml.py index 60a081e2..ab991d96 100644 --- a/pysollib/tile/tkhtml.py +++ b/pysollib/tile/tkhtml.py @@ -527,6 +527,7 @@ def tkhtml_main(args): except: url = os.path.join(os.pardir, os.pardir, "data", "html", "index.html") top = Tkinter.Tk() + top.tk.call("package", "require", "tile") top.wm_minsize(400, 200) viewer = HTMLViewer(top) viewer.app = None diff --git a/pysollib/tile/tkstats.py b/pysollib/tile/tkstats.py index 48b3e640..d0114c6f 100644 --- a/pysollib/tile/tkstats.py +++ b/pysollib/tile/tkstats.py @@ -300,229 +300,98 @@ class SingleGame_StatsDialog(MfxDialog): # // # ************************************************************************/ -class CanvasWriter(PysolStatsFormatter.StringWriter): - def __init__(self, canvas, parent_window, font, w, h): - self.canvas = canvas +class TreeWriter(PysolStatsFormatter.StringWriter): + def __init__(self, tree, parent_window, font, w, h): + self.tree = tree self.parent_window = parent_window - ##self.fg = canvas.cget("insertbackground") - self.fg = canvas.option_get('foreground', '') or canvas.cget("insertbackground") self.font = font - self.w = w - self.h = h - self.x = self.y = 0 self.gameid = None self.gamenumber = None - self.canvas.config(yscrollincrement=h) self._tabs = None - - def _addItem(self, id): - self.canvas.dialog.nodes[id] = (self.gameid, self.gamenumber) + self.w = w + self.h = h def p(self, s): - if self.y > 16000: - return - h1, h2 = 0, 0 - while s and s[0] == "\n": - s = s[1:] - h1 = h1 + self.h - while s and s[-1] == "\n": - s = s[:-1] - h2 = h2 + self.h - self.y = self.y + h1 - if s: - id = self.canvas.create_text(self.x, self.y, text=s, anchor="nw", - font=self.font, fill=self.fg) - self._addItem(id) - self.y = self.y + h2 + pass def pheader(self, s): pass def _calc_tabs(self, arg): - tw = 15*self.w + if self.parent_window.tree_tabs: + self._tabs = self.parent_window.tree_tabs + return + tw = 20*self.w ##tw = 160 self._tabs = [tw] - font = tkFont.Font(self.canvas, self.font) + font = tkFont.Font(self.tree, self.font) for t in arg[1:]: tw = font.measure(t)+20 self._tabs.append(tw) self._tabs.append(10) + self.parent_window.tree_tabs = self._tabs def pstats(self, *args, **kwargs): - gameid=kwargs.get('gameid', None) header = False if self._tabs is None: # header - header = True self._calc_tabs(args) - self.gameid = 'header' - self.gamenumber = None -## if False: -## sort_by = ( 'name', 'played', 'won', 'lost', -## 'time', 'moves', 'percent', ) -## frame = Tkinter.Frame(self.canvas) -## i = 0 -## for t in args: -## w = self._tabs[i] -## if i == 0: -## w += 10 -## b = Tkinter.Button(frame, text=t) -## b.grid(row=0, column=i, sticky='ew') -## b.bind('<1>', lambda e, f=self.parent_window.rearrange, s=sort_by[i]: f(s)) -## frame.columnconfigure(i, minsize=w) -## i += 1 -## self.canvas.create_window(0, 0, window=frame, anchor='nw') -## self.y += 20 -## return -## if False: -## i = 0 -## x = 0 -## for t in args: -## w = self._tabs[i] -## h = 18 -## anchor = 'ne' -## y = 0 -## self.canvas.create_rectangle(x+2, y, x+w, y+h, width=1, -## fill="#00ff00", outline="#000000") -## x += w -## self.canvas.create_text(x-3, y+3, text=t, anchor=anchor) -## i += 1 -## self.y += 20 -## return + header = True - else: - self.gameid = gameid - self.gamenumber = None - if self.y > 16000: - return - x, y = 1, self.y - p = self._pstats_text t1, t2, t3, t4, t5, t6, t7 = args - h = 0 if not header: t1=gettext(t1) # game name - for var, text, anchor, tab in ( - ('name', t1, 'nw', self._tabs[0]+self._tabs[1]), - ('played', t2, 'ne', self._tabs[2]), - ('won', t3, 'ne', self._tabs[3]), - ('lost', t4, 'ne', self._tabs[4]), - ('time', t5, 'ne', self._tabs[5]), - ('moves', t6, 'ne', self._tabs[6]), - ('percent', t7, 'ne', self._tabs[7]), ): - if header: self.gamenumber=var - h = max(h, p(x, y, anchor=anchor, text=text)) - x += tab + if header: + for column, text, anchor, tab in ( + ('#0', t1, 'nw', self._tabs[0]), + ('played', t2, 'ne', self._tabs[1]), + ('won', t3, 'ne', self._tabs[2]), + ('lost', t4, 'ne', self._tabs[3]), + ('time', t5, 'ne', self._tabs[4]), + ('moves', t6, 'ne', self._tabs[5]), + ('percent', t7, 'ne', self._tabs[6]), ): + self.tree.heading(column, text=text, + command=lambda par=self.parent_window, col=column: par.headerClick(col)) + self.tree.column(column, width=tab) + else: + id = self.tree.insert(None, "end", text=t1, + values=(t2, t3, t4, t5, t6, t7)) + self.parent_window.tree_items.append(id) - self.pstats_perc(x, y, t7) - self.y += h - self.gameid = None - return + def plog(self, *args, **kwargs): + header = False + if self._tabs is None: + # header + self._calc_tabs(('', '99999999999999999999', '9999-99-99 99:99', 'XXXXXXXXXXXX')) + header = True -## h = max(h, p(x, y, anchor="nw", text=t1)) -## if header: self.gamenumber='played' -## x += self._tabs[0]+self._tabs[1] -## h = max(h, p(x, y, anchor="ne", text=t2)) -## if header: self.gamenumber='won' -## x += self._tabs[2] -## h = max(h, p(x, y, anchor="ne", text=t3)) -## if header: self.gamenumber='lost' -## x += self._tabs[3] -## h = max(h, p(x, y, anchor="ne", text=t4)) -## if header: self.gamenumber='time' -## x += self._tabs[4] -## h = max(h, p(x, y, anchor="ne", text=t5)) -## if header: self.gamenumber='moves' -## x += self._tabs[5] -## h = max(h, p(x, y, anchor="ne", text=t6)) -## if header: self.gamenumber='percent' -## x += self._tabs[6] -## h = max(h, p(x, y, anchor="ne", text=t7)) -## x += self._tabs[7] -## self.pstats_perc(x, y, t7) -## self.y += h -## self.gameid = None + t1, t2, t3, t4 = args[:4] + if not header: t1=gettext(t1) # game name - def _pstats_text(self, x, y, **kw): - kwdefault(kw, font=self.font, fill=self.fg) - id = apply(self.canvas.create_text, (x, y), kw) - self._addItem(id) - return self.h - ##bbox = self.canvas.bbox(id) - ##return bbox[3] - bbox[1] - - def pstats_perc(self, x, y, t): - if not (t and "0" <= t[0] <= "9"): - return - perc = int(round(float(str(t)))) - if perc < 1: - return - rx, ry, rw, rh = x, y+1, 2 + 8*10, self.h-5 - if 1: - w = int(round(rw*perc/100.0)) - if 1 and w < 1: - return - if w > 0: - w = max(3, w) - w = min(rw - 2, w) - id = self.canvas.create_rectangle(rx, ry, rx+w, ry+rh, width=1, - fill="#00ff00", outline="#000000") - if w < rw: - id = self.canvas.create_rectangle(rx+w, ry, rx+rw, ry+rh, width=1, - fill="#ff0000", outline="#000000") - return - ##fill = "#ffffff" - ##fill = self.canvas["bg"] - fill = None - id = self.canvas.create_rectangle(rx, ry, rx+rw, ry+rh, width=1, - fill=fill, outline="#808080") - if 1: - rx, rw = rx + 1, rw - 1 - ry, rh = ry + 1, rh - 1 - w = int(round(rw*perc/100.0)) - if w > 0: - id = self.canvas.create_rectangle(rx, ry, rx+w, ry+rh, width=0, - fill="#00ff00", outline="") - if w < rw: - id = self.canvas.create_rectangle(rx+w, ry, rx+rw, ry+rh, width=0, - fill="#ff0000", outline="") - return - p = 1.0 - ix = rx + 2 - for i in (1, 11, 21, 31, 41, 51, 61, 71, 81, 91): - if perc < i: - break - ##c = "#ff8040" - r, g, b = 255, 128*p, 64*p - c = "#%02x%02x%02x" % (int(r), int(g), int(b)) - id = self.canvas.create_rectangle(ix, ry+2, ix+6, ry+rh-2, width=0, - fill=c, outline=c) - ix = ix + 8 - p = max(0.0, p - 0.1) - - def plog(self, gamename, gamenumber, date, status, gameid=-1, won=-1): - if gameid > 0 and "0" <= gamenumber[0:1] <= "9": - self.gameid = gameid - self.gamenumber = gamenumber - self.p("%-25s %-20s %17s %s\n" % (gamename, gamenumber, date, status)) - self.gameid = None - self.gamenumber = None + if header: + for column, text, anchor, tab in ( + ('#0', t1, 'nw', self._tabs[0]), + ('gamenumber', t2, 'ne', self._tabs[1]), + ('date', t3, 'ne', self._tabs[2]), + ('status', t4, 'ne', self._tabs[3]), ): + self.tree.heading(column, text=text, + command=lambda par=self.parent_window, col=column: par.headerClick(col)) + self.tree.column(column, width=tab) + ##if column in ('gamenumber', 'date', 'status'): + ## self.tree.column(column, anchor='center') + else: + id = self.tree.insert(None, "end", text=t1, values=(t2, t3, t4)) + self.parent_window.tree_items.append(id) # /*********************************************************************** # // # ************************************************************************/ -class AllGames_StatsDialogScrolledCanvas(MfxScrolledCanvas): - pass - - class AllGames_StatsDialog(MfxDialog): - # for font "canvas_fixed" - #CHAR_W, CHAR_H = 7, 16 - #if os.name == "mac": CHAR_W = 6 - # - YVIEW = 0 + FONT_TYPE = "default" + COLUMNS = ('played', 'won', 'lost', 'time', 'moves', 'percent') def __init__(self, parent, title, app, player, **kw): lines = 25 @@ -539,6 +408,8 @@ class AllGames_StatsDialog(MfxDialog): self.player = player self.title = title self.sort_by = 'name' + self.tree_items = [] + self.tree_tabs = None # kwdefault(kw, width=self.CHAR_W*64, height=lines*self.CHAR_H) kw = self.initKw(kw) @@ -549,22 +420,15 @@ class AllGames_StatsDialog(MfxDialog): self.top.wm_minsize(200, 200) self.button = kw.default # - self.sc = AllGames_StatsDialogScrolledCanvas(top_frame, - width=kw.width, height=kw.height) - self.sc.pack(fill=Tkinter.BOTH, expand=1, padx=kw.padx, pady=kw.pady) - # - self.nodes = {} - self.canvas = self.sc.canvas - self.canvas.dialog = self - bind(self.canvas, "<1>", self.singleClick) + frame = Tkinter.Frame(top_frame) + frame.pack(fill='both', expand=True, padx=kw.padx, pady=kw.pady) + sb = Tkinter.Scrollbar(frame) + sb.pack(side='right', fill='y') + self.tree = Tkinter.Treeview(frame, columns=self.COLUMNS) + self.tree.pack(side='left', fill='both', expand=True) + self.tree.config(yscrollcommand=sb.set) + sb.config(command=self.tree.yview) self.fillCanvas(player, title) - bbox = self.canvas.bbox("all") - ##print bbox - ##self.canvas.config(scrollregion=bbox) - dx, dy = 4, 0 - self.canvas.config(scrollregion=(-dx,-dy,bbox[2]+dx,bbox[3]+dy)) - self.canvas.xview_moveto(-dx) - self.canvas.yview_moveto(self.YVIEW) # focus = self.createButtons(bottom_frame, kw) self.mainloop(focus, kw.timeout) @@ -583,47 +447,32 @@ class AllGames_StatsDialog(MfxDialog): def destroy(self): self.app = None - self.canvas.dialog = None - self.nodes = {} - self.sc.destroy() + self.tree.destroy() MfxDialog.destroy(self) - def rearrange(self, sort_by): + def headerClick(self, column): + if column == '#0': + sort_by = 'name' + else: + sort_by = column if self.sort_by == sort_by: return self.sort_by = sort_by self.fillCanvas(self.player, self.title) - def singleClick(self, event=None): - id = self.canvas.find_withtag(Tkinter.CURRENT) - if not id: - return - ##print id, self.nodes.get(id[0]) - gameid, gamenumber = self.nodes.get(id[0], (None, None)) - if gameid == 'header': - if self.sort_by == gamenumber: return - self.sort_by = gamenumber - self.fillCanvas(self.player, self.title) - return - ## FIXME / TODO - return - if gameid and gamenumber: - print gameid, gamenumber - elif gameid: - print gameid - # # # def fillCanvas(self, player, header): - self.canvas.delete('all') - self.nodes = {} + if self.tree_items: + self.tree.delete(tuple(self.tree_items)) + self.tree_items = [] a = PysolStatsFormatter(self.app) - #print 'CHAR_W:', self.CHAR_W - writer = CanvasWriter(self.canvas, self, - self.font, self.CHAR_W, self.CHAR_H) + writer = TreeWriter(self.tree, self, + self.font, self.CHAR_W, self.CHAR_H) if not a.writeStats(writer, player, header, sort_by=self.sort_by): - writer.p(_("No entries for player ") + player + "\n") + # FIXME + pass destruct(writer) destruct(a) @@ -633,35 +482,45 @@ class AllGames_StatsDialog(MfxDialog): # ************************************************************************/ class FullLog_StatsDialog(AllGames_StatsDialog): - YVIEW = 1 + FONT_TYPE = "fixed" + COLUMNS = ('gamenumber', 'date', 'status') def fillCanvas(self, player, header): a = PysolStatsFormatter(self.app) - writer = CanvasWriter(self.canvas, self, self.font, self.CHAR_W, self.CHAR_H) + writer = TreeWriter(self.tree, self, self.font, + self.CHAR_W, self.CHAR_H) if not a.writeFullLog(writer, player, header): - writer.p(_("No log entries for %s\n") % player) + # FIXME + pass destruct(a) def initKw(self, kw): kw = KwStruct(kw, - strings=(_("&OK"), (_("Session &log..."), 104), (_("&Save to file"), 203)), default=0, + strings=(_("&OK"), (_("Session &log..."), 104), + (_("&Save to file"), 203)), default=0, width=76*self.CHAR_W, ) return AllGames_StatsDialog.initKw(self, kw) + def headerClick(self, column): + pass + class SessionLog_StatsDialog(FullLog_StatsDialog): def fillCanvas(self, player, header): a = PysolStatsFormatter(self.app) - writer = CanvasWriter(self.canvas, self, self.font, self.CHAR_W, self.CHAR_H) + writer = TreeWriter(self.tree, self, self.font, + self.CHAR_W, self.CHAR_H) if not a.writeSessionLog(writer, player, header): - writer.p(_("No current session log entries for %s\n") % player) + # FIXME + pass destruct(a) def initKw(self, kw): kw = KwStruct(kw, - strings=(_("&OK"), (_("&Full log..."), 103), (_("&Save to file"), 204)), default=0, + strings=(_("&OK"), (_("&Full log..."), 103), + (_("&Save to file"), 204)), default=0, ) return FullLog_StatsDialog.initKw(self, kw) diff --git a/pysollib/tile/tkutil.py b/pysollib/tile/tkutil.py index ace112bc..a1d4efe1 100644 --- a/pysollib/tile/tkutil.py +++ b/pysollib/tile/tkutil.py @@ -430,5 +430,12 @@ def load_theme(app, top, theme): top.tk_setPalette(bg) bg = top.tk.call('style', 'lookup', '.', '-background', 'active') top.option_add('*Menu.activeBackground', bg) + font = app.opt.fonts['default'] + if font: + top.tk.call('style', 'configure', '.', '-font', font) + else: + font = top.tk.call('style', 'lookup', '.', '-font') + top.option_add('*font', font) +