From 73e38ec49450629eda56b62eae35babfe5e49eef Mon Sep 17 00:00:00 2001
From: Alexandre Detiste <alexandre.detiste@gmail.com>
Date: Mon, 21 Oct 2024 00:57:17 +0200
Subject: [PATCH 1/3] finish removing dependency on six

--- a/pysollib/htmllib2.py
+++ b/pysollib/htmllib2.py
@@ -3,11 +3,10 @@
 See the HTML 2.0 specification:
 http://www.w3.org/hypertext/WWW/MarkUp/html-spec/html-spec_toc.html
 """
+import html.parser as html_parser
 
 from pysollib.formatter import AS_IS
 
-from six.moves import html_parser
-
 
 class HTMLParseError(RuntimeError):
     """Error raised when an HTML document can't be parsed."""
diff --git a/pysollib/tile/basetilemfxdialog.py b/pysollib/tile/basetilemfxdialog.py
index 58ff19a110..ae4f2c68cb 100644
--- a/pysollib/tile/basetilemfxdialog.py
+++ b/pysollib/tile/basetilemfxdialog.py
@@ -1,4 +1,4 @@
-from six.moves import tkinter_ttk as ttk
+import tkinter.ttk as ttk
 
 from .tkwidget import MfxDialog
 
diff --git a/pysollib/tile/fontsdialog.py b/pysollib/tile/fontsdialog.py
index 39c9392730..00243907f2 100644
--- a/pysollib/tile/fontsdialog.py
+++ b/pysollib/tile/fontsdialog.py
@@ -22,14 +22,13 @@
 # ---------------------------------------------------------------------------
 
 import tkinter
+import tkinter.font
+import tkinter.ttk as ttk
 
 from pysollib.mfxutil import KwStruct
 from pysollib.mygettext import _
 from pysollib.ui.tktile.tkutil import bind
 
-from six.moves import tkinter_font
-from six.moves import tkinter_ttk as ttk
-
 from .tkwidget import MfxDialog
 from .tkwidget import PysolScale
 
@@ -109,7 +108,7 @@ def __init__(self, parent, title, init_font, **kw):
                         command=self.fontupdate, variable=self.size_var)
         sc.grid(row=4, column=0, columnspan=2, sticky='news')
         #
-        font_families = list(tkinter_font.families())
+        font_families = list(tkinter.font.families())
         font_families.sort()
         selected = -1
         n = 0
diff --git a/pysollib/tile/menubar.py b/pysollib/tile/menubar.py
index 1920b9c946..e202a6177f 100644
--- a/pysollib/tile/menubar.py
+++ b/pysollib/tile/menubar.py
@@ -21,6 +21,8 @@
 #
 # ---------------------------------------------------------------------------##
 
+import tkinter.ttk as ttk
+
 from pysollib.mygettext import _, n_
 from pysollib.settings import TITLE
 from pysollib.ui.tktile.findcarddialog import connect_game_find_card_dialog
@@ -32,8 +34,6 @@
 from pysollib.ui.tktile.solverdialog import connect_game_solver_dialog
 from pysollib.util import CARDSET
 
-from six.moves import tkinter_ttk as ttk
-
 from .selectgame import SelectGameDialog, SelectGameDialogWithPreview
 from .selecttile import SelectTileDialogWithPreview
 from .soundoptionsdialog import SoundOptionsDialog
diff --git a/pysollib/tile/playeroptionsdialog.py b/pysollib/tile/playeroptionsdialog.py
index 604b5aff34..76e1bb4793 100644
--- a/pysollib/tile/playeroptionsdialog.py
+++ b/pysollib/tile/playeroptionsdialog.py
@@ -22,12 +22,11 @@
 # ---------------------------------------------------------------------------##
 
 import tkinter
+import tkinter.ttk as ttk
 
 from pysollib.mfxutil import KwStruct
 from pysollib.mygettext import _
 
-from six.moves import tkinter_ttk as ttk
-
 from .tkwidget import MfxDialog
 
 
diff --git a/pysollib/tile/progressbar.py b/pysollib/tile/progressbar.py
index 703bf27216..2b2f96885e 100644
--- a/pysollib/tile/progressbar.py
+++ b/pysollib/tile/progressbar.py
@@ -22,12 +22,11 @@
 # ---------------------------------------------------------------------------
 
 import tkinter
+import tkinter.ttk as ttk
 
 from pysollib.ui.tktile.tkconst import EVENT_HANDLED
 from pysollib.ui.tktile.tkutil import makeToplevel, setTransient
 
-from six.moves import tkinter_ttk as ttk
-
 # ************************************************************************
 # * a simple progress bar
 # ************************************************************************
diff --git a/pysollib/tile/selectcardset.py b/pysollib/tile/selectcardset.py
index 4b5ec03068..13ad74fa30 100644
--- a/pysollib/tile/selectcardset.py
+++ b/pysollib/tile/selectcardset.py
@@ -23,6 +23,7 @@
 
 import os
 import tkinter
+import tkinter.ttk as ttk
 
 from pysollib.mfxutil import KwStruct, USE_PIL
 from pysollib.mygettext import _
@@ -32,8 +33,6 @@
 from pysollib.ui.tktile.tkutil import bind, loadImage
 from pysollib.util import CARDSET
 
-from six.moves import tkinter_ttk as ttk
-
 from .selecttree import SelectDialogTreeCanvas
 from .selecttree import SelectDialogTreeLeaf, SelectDialogTreeNode
 from .tkwidget import MfxDialog, MfxScrolledCanvas, PysolCombo, PysolScale
diff --git a/pysollib/tile/selectgame.py b/pysollib/tile/selectgame.py
index 218ccbe758..9975d8253d 100644
--- a/pysollib/tile/selectgame.py
+++ b/pysollib/tile/selectgame.py
@@ -23,6 +23,7 @@
 
 import os
 import tkinter
+import tkinter.ttk as ttk
 from collections import UserList
 
 from pysollib.gamedb import GI
@@ -33,8 +34,6 @@
 from pysollib.ui.tktile.selecttree import SelectDialogTreeData
 from pysollib.ui.tktile.tkutil import bind, unbind_destroy
 
-from six.moves import tkinter_ttk as ttk
-
 from .selecttree import SelectDialogTreeCanvas
 from .selecttree import SelectDialogTreeLeaf, SelectDialogTreeNode
 from .tkwidget import MfxDialog, MfxScrolledCanvas, PysolCombo
diff --git a/pysollib/tile/selecttile.py b/pysollib/tile/selecttile.py
index 56e779063a..fca9b27c3b 100644
--- a/pysollib/tile/selecttile.py
+++ b/pysollib/tile/selecttile.py
@@ -23,6 +23,8 @@
 
 import os
 import tkinter
+import tkinter.colorchooser
+import tkinter.ttk as ttk
 
 from pysollib.mfxutil import KwStruct, USE_PIL
 from pysollib.mygettext import _
@@ -30,9 +32,6 @@
 from pysollib.ui.tktile.selecttree import SelectDialogTreeData
 from pysollib.ui.tktile.tkutil import bind
 
-from six.moves import tkinter_colorchooser
-from six.moves import tkinter_ttk as ttk
-
 from .selecttree import SelectDialogTreeCanvas
 from .selecttree import SelectDialogTreeLeaf, SelectDialogTreeNode
 from .tkwidget import MfxDialog, MfxScrolledCanvas, PysolCombo
@@ -282,7 +281,7 @@ def mDone(self, button):
             self.tree.n_expansions = 1  # save xyview in any case
         if button == 10:  # "Solid color..."
             try:
-                c = tkinter_colorchooser.askcolor(
+                c = tkinter.colorchooser.askcolor(
                     master=self.top,
                     initialcolor=self.table_color,
                     title=_("Select table color"))
diff --git a/pysollib/tile/soundoptionsdialog.py b/pysollib/tile/soundoptionsdialog.py
index ed7390ebba..55bc3a88b4 100644
--- a/pysollib/tile/soundoptionsdialog.py
+++ b/pysollib/tile/soundoptionsdialog.py
@@ -23,6 +23,7 @@
 
 import os
 import tkinter
+import tkinter.ttk as ttk
 
 from pysollib.mfxutil import KwStruct
 from pysollib.mygettext import _
@@ -30,8 +31,6 @@
 from pysollib.settings import TITLE
 from pysollib.ui.tktile.tkconst import EVENT_HANDLED
 
-from six.moves import tkinter_ttk as ttk
-
 from .tkwidget import MfxDialog, MfxMessageDialog
 from .tkwidget import PysolScale
 
diff --git a/pysollib/tile/statusbar.py b/pysollib/tile/statusbar.py
index c236321714..51636a9e8d 100644
--- a/pysollib/tile/statusbar.py
+++ b/pysollib/tile/statusbar.py
@@ -25,11 +25,10 @@
 import os
 import sys
 import tkinter
+import tkinter.ttk as ttk
 
 from pysollib.mygettext import _
 
-from six.moves import tkinter_ttk as ttk
-
 from .tkwidget import MfxTooltip
 
 if __name__ == '__main__':
diff --git a/pysollib/tile/timeoutsdialog.py b/pysollib/tile/timeoutsdialog.py
index c4fafd5ab3..85aad4d7fd 100644
--- a/pysollib/tile/timeoutsdialog.py
+++ b/pysollib/tile/timeoutsdialog.py
@@ -22,12 +22,11 @@
 # ---------------------------------------------------------------------------##
 
 import tkinter
+import tkinter.ttk as ttk
 
 from pysollib.mfxutil import KwStruct
 from pysollib.mygettext import _
 
-from six.moves import tkinter_ttk as ttk
-
 from .tkwidget import MfxDialog, PysolScale
 
 
diff --git a/pysollib/tile/tkhtml.py b/pysollib/tile/tkhtml.py
index 0e2c357bca..e37915050d 100644
--- a/pysollib/tile/tkhtml.py
+++ b/pysollib/tile/tkhtml.py
@@ -24,13 +24,12 @@
 import os
 import sys
 import tkinter
+import tkinter.ttk as ttk
 
 from pysollib.mfxutil import Struct
 from pysollib.mygettext import _
 from pysollib.ui.tktile.tkhtml import Base_HTMLViewer
 
-from six.moves import tkinter_ttk as ttk
-
 from .statusbar import HtmlStatusbar
 from .tkwidget import MfxMessageDialog
 
diff --git a/pysollib/tile/tkstats.py b/pysollib/tile/tkstats.py
index 8d596520c4..aa163a553d 100644
--- a/pysollib/tile/tkstats.py
+++ b/pysollib/tile/tkstats.py
@@ -24,6 +24,8 @@
 import os
 import time
 import tkinter
+import tkinter.font
+import tkinter.ttk as ttk
 
 from pysollib.mfxutil import KwStruct
 from pysollib.mfxutil import format_time
@@ -32,9 +34,6 @@
 from pysollib.stats import ProgressionFormatter, PysolStatsFormatter
 from pysollib.ui.tktile.tkutil import bind, loadImage
 
-from six.moves import tkinter_font
-from six.moves import tkinter_ttk as ttk
-
 from .tkwidget import MfxDialog, MfxMessageDialog
 
 
@@ -54,11 +53,11 @@ def __init__(self, parent, title, app, player, gameid, **kw):
         MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
 
         self.font = app.getFont('default')
-        self.tkfont = tkinter_font.Font(parent, self.font)
+        self.tkfont = tkinter.font.Font(parent, self.font)
         self.font_metrics = self.tkfont.metrics()
         style = ttk.Style(parent)
         heading_font = style.lookup('Heading', 'font')  # treeview heading
-        self.heading_tkfont = tkinter_font.Font(parent, heading_font)
+        self.heading_tkfont = tkinter.font.Font(parent, heading_font)
 
         self.selected_game = None
 
@@ -502,10 +501,10 @@ class LogDialog(MfxDialog):
     def __init__(self, parent, title, app, player, **kw):
 
         self.font = app.getFont('default')
-        self.tkfont = tkinter_font.Font(parent, self.font)
+        self.tkfont = tkinter.font.Font(parent, self.font)
         style = ttk.Style(parent)
         heading_font = style.lookup('Heading', 'font')  # treeview heading
-        self.heading_tkfont = tkinter_font.Font(parent, heading_font)
+        self.heading_tkfont = tkinter.font.Font(parent, heading_font)
         self.font_metrics = self.tkfont.metrics()
 
         self.CHAR_H = self.font_metrics['linespace']
diff --git a/pysollib/tile/tkwidget.py b/pysollib/tile/tkwidget.py
index 1e990cac7b..c8cb6f3aed 100644
--- a/pysollib/tile/tkwidget.py
+++ b/pysollib/tile/tkwidget.py
@@ -25,6 +25,8 @@
 import os
 import time
 import tkinter
+import tkinter.font
+import tkinter.ttk as ttk
 import traceback
 
 from pysollib.mfxutil import KwStruct, destruct, kwdefault, openURL
@@ -35,9 +37,6 @@
 from pysollib.ui.tktile.tkutil import bind, unbind_destroy
 from pysollib.ui.tktile.tkutil import makeToplevel, setTransient
 
-from six.moves import tkinter_font
-from six.moves import tkinter_ttk as ttk
-
 # ************************************************************************
 # * abstract base class for the dialogs in this module
 # ************************************************************************
@@ -313,7 +312,7 @@ def __init__(self, app, parent, title, **kw):
 
         # font_name = msg.lookup('TLabel', 'font')
         font_name = 'TkDefaultFont'
-        font = tkinter_font.Font(parent, name=font_name, exists=True)
+        font = tkinter.font.Font(parent, name=font_name, exists=True)
         font = font.copy()
         font.configure(underline=True)
         url_label = ttk.Label(frame, text=kw.url, font=font,
diff --git a/pysollib/tile/toolbar.py b/pysollib/tile/toolbar.py
index 12520d8322..a240a8f07e 100644
--- a/pysollib/tile/toolbar.py
+++ b/pysollib/tile/toolbar.py
@@ -23,6 +23,7 @@
 
 import os
 import tkinter
+import tkinter.ttk as ttk
 
 from pysollib.mfxutil import Image, ImageOps, ImageTk
 from pysollib.mygettext import _, n_
@@ -33,8 +34,6 @@
 from pysollib.util import IMAGE_EXTENSIONS
 from pysollib.winsystems import TkSettings
 
-from six.moves import tkinter_ttk as ttk
-
 from .tkwidget import MfxTooltip
 
 
diff --git a/pysollib/tile/wizarddialog.py b/pysollib/tile/wizarddialog.py
index 534f7b8805..fda7dc8f92 100644
--- a/pysollib/tile/wizarddialog.py
+++ b/pysollib/tile/wizarddialog.py
@@ -22,14 +22,13 @@
 # ---------------------------------------------------------------------------
 
 import tkinter
+import tkinter.ttk as ttk
 
 from pysollib.mfxutil import KwStruct
 from pysollib.mygettext import _
 from pysollib.wizardpresets import presets
 from pysollib.wizardutil import WizardWidgets
 
-from six.moves import tkinter_ttk as ttk
-
 from .tkwidget import MfxDialog
 from .tkwidget import PysolCombo, PysolScale
 
diff --git a/pysollib/tk/fontsdialog.py b/pysollib/tk/fontsdialog.py
index 8347e6532e..b6013bc83b 100644
--- a/pysollib/tk/fontsdialog.py
+++ b/pysollib/tk/fontsdialog.py
@@ -22,14 +22,13 @@
 # ---------------------------------------------------------------------------##
 
 import tkinter
+import tkinter.font
 
 from pysollib.mfxutil import KwStruct
 from pysollib.mygettext import _
 from pysollib.tk.tkwidget import MfxDialog
 from pysollib.ui.tktile.tkutil import bind
 
-from six.moves import tkinter_font
-
 
 class FontChooserDialog(MfxDialog):
     def __init__(self, parent, title, init_font, **kw):
@@ -101,7 +100,7 @@ def __init__(self, parent, title, init_font, **kw):
         self.size_var.set(self.font_size)
         self.weight_var.set(self.font_weight == 'bold')
         self.slant_var.set(self.font_slant == 'italic')
-        font_families = list(tkinter_font.families())
+        font_families = list(tkinter.font.families())
         font_families.sort()
         selected = -1
         n = 0
diff --git a/pysollib/tk/selecttile.py b/pysollib/tk/selecttile.py
index cb447213a4..e754daa24d 100644
--- a/pysollib/tk/selecttile.py
+++ b/pysollib/tk/selecttile.py
@@ -22,13 +22,12 @@
 # ---------------------------------------------------------------------------##
 
 import tkinter
+import tkinter.colorchooser
 
 from pysollib.mfxutil import KwStruct
 from pysollib.mygettext import _
 from pysollib.ui.tktile.selecttree import SelectDialogTreeData
 
-from six.moves import tkinter_colorchooser
-
 from .selecttree import SelectDialogTreeCanvas
 from .selecttree import SelectDialogTreeLeaf, SelectDialogTreeNode
 from .tkwidget import MfxDialog, MfxScrolledCanvas
@@ -176,7 +175,7 @@ def mDone(self, button):
             self.tree.n_expansions = 1  # save xyview in any case
         if button == 1:        # "Solid color..."
             try:
-                c = tkinter_colorchooser.askcolor(
+                c = tkinter.colorchooser.askcolor(
                     master=self.top,
                     initialcolor=self.table_color,
                     title=_("Select table color"))
diff --git a/pysollib/tk/tkstats.py b/pysollib/tk/tkstats.py
index 509a74300e..3f11c58a6c 100644
--- a/pysollib/tk/tkstats.py
+++ b/pysollib/tk/tkstats.py
@@ -24,6 +24,7 @@
 import os
 import time
 import tkinter
+import tkinter.font
 
 from pysollib.mfxutil import KwStruct, kwdefault
 from pysollib.mfxutil import format_time
@@ -32,8 +33,6 @@
 from pysollib.stats import ProgressionFormatter, PysolStatsFormatter
 from pysollib.ui.tktile.tkutil import bind, loadImage
 
-from six.moves import tkinter_font
-
 from .tkwidget import MfxDialog, MfxMessageDialog
 from .tkwidget import MfxScrolledCanvas
 
@@ -63,7 +62,7 @@ def __init__(self, parent, title, app, player, gameid, **kw):
         #      createChart = self.createSimpleChart
         #
         self.font = self.app.getFont("default")
-        self.tk_font = tkinter_font.Font(self.top, self.font)
+        self.tk_font = tkinter.font.Font(self.top, self.font)
         self.font_metrics = self.tk_font.metrics()
         self._calc_tabs()
         #
@@ -313,7 +312,7 @@ def _calc_tabs(self, arg):
         tw = 15*self.w
         # tw = 160
         self._tabs = [tw]
-        font = tkinter_font.Font(self.canvas, self.font)
+        font = tkinter.font.Font(self.canvas, self.font)
         for t in arg[1:]:
             tw = font.measure(t)+20
             self._tabs.append(tw)
@@ -460,7 +459,7 @@ def __init__(self, parent, title, app, player, **kw):
         #    lines = 20
         #
         self.font = app.getFont(self.FONT_TYPE)
-        font = tkinter_font.Font(parent, self.font)
+        font = tkinter.font.Font(parent, self.font)
         self.font_metrics = font.metrics()
         self.CHAR_H = self.font_metrics['linespace']
         self.CHAR_W = font.measure('M')
@@ -816,8 +815,8 @@ class ProgressionDialog(MfxDialog):
     def __init__(self, parent, title, app, player, gameid, **kw):
 
         font_name = app.getFont('default')
-        font = tkinter_font.Font(parent, font_name)
-        tkfont = tkinter_font.Font(parent, font)
+        font = tkinter.font.Font(parent, font_name)
+        tkfont = tkinter.font.Font(parent, font)
         font_metrics = font.metrics()
         measure = tkfont.measure
         self.text_height = font_metrics['linespace']
diff --git a/pysollib/tk/tkwidget.py b/pysollib/tk/tkwidget.py
index dd63bb0cee..1380546e41 100644
--- a/pysollib/tk/tkwidget.py
+++ b/pysollib/tk/tkwidget.py
@@ -23,6 +23,7 @@
 
 import time
 import tkinter
+import tkinter.font
 import traceback
 
 from pysollib.mfxutil import KwStruct, destruct, kwdefault, openURL
@@ -33,8 +34,6 @@
 from pysollib.ui.tktile.tkutil import bind, unbind_destroy
 from pysollib.ui.tktile.tkutil import makeToplevel, setTransient
 
-from six.moves import tkinter_font
-
 # ************************************************************************
 # * abstract base class for the dialogs in this module
 # ************************************************************************
@@ -307,7 +306,7 @@ def __init__(self, app, parent, title, **kw):
                             width=kw.width)
         msg.pack(fill='both', expand=True)
 
-        font = tkinter_font.Font(parent, app.getFont('default'))
+        font = tkinter.font.Font(parent, app.getFont('default'))
         font.configure(underline=True)
         url_label = tkinter.Label(frame, text=kw.url, font=font,
                                   foreground='blue', cursor='hand2')
diff --git a/pysollib/ui/tktile/colorsdialog.py b/pysollib/ui/tktile/colorsdialog.py
index 0a7ebf3c61..a280a88102 100644
--- a/pysollib/ui/tktile/colorsdialog.py
+++ b/pysollib/ui/tktile/colorsdialog.py
@@ -22,12 +22,11 @@
 # ---------------------------------------------------------------------------
 
 import tkinter
+from tkinter.colorchooser import askcolor
 
 from pysollib.mfxutil import KwStruct
 from pysollib.mygettext import _
 
-from six.moves.tkinter_colorchooser import askcolor
-
 
 class BaseColorsDialog:
     def _calcFrame(self):
diff --git a/pysollib/ui/tktile/menubar.py b/pysollib/ui/tktile/menubar.py
index d10f2a1cf1..645cfd6b17 100644
--- a/pysollib/ui/tktile/menubar.py
+++ b/pysollib/ui/tktile/menubar.py
@@ -4,6 +4,7 @@
 import re
 import sys
 import tkinter
+import tkinter.tkfiledialog
 
 from pysollib.gamedb import GI
 from pysollib.hint import PySolHintLayoutImportError
@@ -18,8 +19,6 @@
 from pysollib.ui.tktile.tkconst import STATUSBAR_ITEMS, TOOLBAR_BUTTONS
 from pysollib.ui.tktile.tkutil import after_idle, bind
 
-from six.moves import tkinter_tkfiledialog
-
 
 def createToolbarMenu(menubar, menu):
     tearoff = menu.cget('tearoff')
@@ -1440,7 +1439,7 @@ def mOpen(self, *event):
             idir, ifile = "", ""
         if not idir:
             idir = self.app.dn.savegames
-        d = tkinter_tkfiledialog.Open()
+        d = tkinter.tkfiledialog.Open()
         filename = d.show(filetypes=self.FILETYPES,
                           defaultextension=self.DEFAULTEXTENSION,
                           initialdir=idir, initialfile=ifile)
@@ -1477,7 +1476,7 @@ def mExportCurrentLayout(self, *event):
         if not idir:
             idir = self.app.dn.boards
         # print self.game.filename, ifile
-        d = tkinter_tkfiledialog.SaveAs()
+        d = tkinter.tkfiledialog.SaveAs()
         filename = d.show(filetypes=self.FILETYPES,
                           defaultextension=self.DEFAULTEXTENSION,
                           initialdir=idir, initialfile=ifile)
@@ -1509,7 +1508,7 @@ def mImportStartingLayout(self, *event):
             idir, ifile = "", ""
         if not idir:
             idir = self.app.dn.boards
-        d = tkinter_tkfiledialog.Open()
+        d = tkinter.tkfiledialog.Open()
         key = 'PYSOL_DEBUG_IMPORT'
         if key not in os.environ:
             filename = d.show(filetypes=self.FILETYPES,
@@ -1556,7 +1555,7 @@ def mSaveAs(self, *event):
         if not idir:
             idir = self.app.dn.savegames
         # print self.game.filename, ifile
-        d = tkinter_tkfiledialog.SaveAs()
+        d = tkinter.tkfiledialog.SaveAs()
         filename = d.show(filetypes=self.FILETYPES,
                           defaultextension=self.DEFAULTEXTENSION,
                           initialdir=idir, initialfile=ifile)
diff --git a/pysollib/ui/tktile/selecttree.py b/pysollib/ui/tktile/selecttree.py
index 1b63445d8d..57713934b4 100644
--- a/pysollib/ui/tktile/selecttree.py
+++ b/pysollib/ui/tktile/selecttree.py
@@ -26,7 +26,7 @@
 # ************************************************************************
 
 # imports
-from six.moves import tkinter_font
+import tkinter.font
 
 
 class BaseSelectDialogTreeLeaf:
@@ -111,7 +111,7 @@ def __init__(self, dialog, parent, key, default,
         self.style.height = 14    # height of symbol
         if font:
             self.style.font = font
-            f = tkinter_font.Font(parent, font)
+            f = tkinter.font.Font(parent, font)
             h = f.metrics()["linespace"]
             self.style.disty = max(self.style.width, h)
 
diff --git a/pysollib/ui/tktile/tkutil.py b/pysollib/ui/tktile/tkutil.py
index c93cdb4320..edda18e4be 100644
--- a/pysollib/ui/tktile/tkutil.py
+++ b/pysollib/ui/tktile/tkutil.py
@@ -24,13 +24,12 @@
 import os
 import re
 import tkinter
+import tkinter.font
 
 from pysollib.mfxutil import Image, ImageDraw, ImageOps, ImageTk, \
     get_default_resampling
 from pysollib.settings import TITLE, WIN_SYSTEM
 
-from six.moves import tkinter_font
-
 
 # ************************************************************************
 # * window manager util
@@ -498,4 +497,4 @@ def resizeBottom(image, maskimage, color='white', backfile=None):
 # ************************************************************************
 
 def get_text_width(text, font, root=None):
-    return tkinter_font.Font(root=root, font=font).measure(text)
+    return tkinter.font.Font(root=root, font=font).measure(text)
diff --git a/pysollib/winsystems/common.py b/pysollib/winsystems/common.py
index 606d1d9667..bc440d932a 100644
--- a/pysollib/winsystems/common.py
+++ b/pysollib/winsystems/common.py
@@ -34,7 +34,7 @@
 if TOOLKIT == 'tk':
     from pysollib.ui.tktile.tkutil import loadImage
     if USE_TILE:
-        from six.moves import tkinter_ttk as ttk
+        import tkinter.ttk as ttk
 
 
 def init_tile(app, top):
@@ -74,7 +74,7 @@ def get_font_name(font):
     if (TOOLKIT == 'kivy'):
         return "helvetica 12"
 
-    from six.moves.tkinter_font import Font
+    from tkinter.font import Font
     font_name = None
     try:
         f = Font(font=font)
diff --git a/pysollib/winsystems/win32.py b/pysollib/winsystems/win32.py
index d3f75c7dcc..138f78167a 100644
--- a/pysollib/winsystems/win32.py
+++ b/pysollib/winsystems/win32.py
@@ -25,7 +25,7 @@
 from pysollib.winsystems.common import BaseTkSettings, base_init_root_window
 
 if USE_TILE:
-    from six.moves import tkinter_ttk as ttk
+    import tkinter.ttk as ttk
 
 
 def init_root_window(root, app):
diff --git a/pysollib/winsystems/x11.py b/pysollib/winsystems/x11.py
index 33337b24f8..496e5da59c 100644
--- a/pysollib/winsystems/x11.py
+++ b/pysollib/winsystems/x11.py
@@ -33,7 +33,7 @@
 
 if TOOLKIT == 'tk':
     if USE_TILE:
-        from six.moves import tkinter_ttk as ttk
+        import tkinter.ttk as ttk
 
 
 # ************************************************************************
@@ -71,10 +71,10 @@ def init_root_window(root, app):
             except Exception:
                 traceback.print_exc()
             else:
-                from six.moves import tkinter_tkfiledialog
-                tkinter_tkfiledialog.Open.command = 'ttk::getOpenFile'
-                tkinter_tkfiledialog.SaveAs.command = 'ttk::getSaveFile'
-                tkinter_tkfiledialog.Directory.command = 'ttk::chooseDirectory'
+                import tkinter.tkfiledialog
+                tkinter.tkfiledialog.Open.command = 'ttk::getOpenFile'
+                tkinter.tkfiledialog.SaveAs.command = 'ttk::getSaveFile'
+                tkinter.tkfiledialog.Directory.command = 'ttk::chooseDirectory'
 
         style = ttk.Style(root)
         color = style.lookup('.', 'background')
diff --git a/scripts/cardset_viewer.py b/scripts/cardset_viewer.py
index a669cfa593..b6b4c4fec0 100755
--- a/scripts/cardset_viewer.py
+++ b/scripts/cardset_viewer.py
@@ -9,12 +9,11 @@
 
 import os
 import tkinter
+import tkinter.FileDialog
 from glob import glob
 
 from PIL import Image, ImageTk
 
-from six.moves import tkinter_tkfiledialog as filedialog  # messagebox
-
 
 cardset_type = {
     '1': 'French',
@@ -175,7 +174,7 @@ def on_mousewheel(event):
 def select_dir():
     global data_dir
 
-    dialog = filedialog.Directory(root)
+    dialog = tkinter.FileDialog.Directory(root)
     directory = dialog.show()
     if directory:
         data_dir = os.path.normpath(directory)
diff --git a/setup.py b/setup.py
index d46f4128be..d6fdbb12cc 100644
--- a/setup.py
+++ b/setup.py
@@ -78,7 +78,6 @@ def get_data_files(source, destination):
         'attrs>=18.2.0',
         'configobj',
         'pysol_cards',
-        'six',
     ],
     'long_description': long_description,
     'license': 'GPL',

From b87cca648883bdc669491f1a80da4058038cf1e8 Mon Sep 17 00:00:00 2001
From: Alexandre Detiste <alexandre.detiste@gmail.com>
Date: Mon, 21 Oct 2024 01:02:11 +0200
Subject: [PATCH 2/3] fix tkinter.FileDialog

---
 pysollib/ui/tktile/menubar.py | 10 +++++-----
 pysollib/winsystems/x11.py    |  8 ++++----
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/pysollib/ui/tktile/menubar.py b/pysollib/ui/tktile/menubar.py
index 645cfd6b17..62c1d57d85 100644
--- a/pysollib/ui/tktile/menubar.py
+++ b/pysollib/ui/tktile/menubar.py
@@ -4,7 +4,7 @@
 import re
 import sys
 import tkinter
-import tkinter.tkfiledialog
+import tkinter.FileDialog
 
 from pysollib.gamedb import GI
 from pysollib.hint import PySolHintLayoutImportError
@@ -1439,7 +1439,7 @@ def mOpen(self, *event):
             idir, ifile = "", ""
         if not idir:
             idir = self.app.dn.savegames
-        d = tkinter.tkfiledialog.Open()
+        d = tkinter.FileDialog.Open()
         filename = d.show(filetypes=self.FILETYPES,
                           defaultextension=self.DEFAULTEXTENSION,
                           initialdir=idir, initialfile=ifile)
@@ -1476,7 +1476,7 @@ def mExportCurrentLayout(self, *event):
         if not idir:
             idir = self.app.dn.boards
         # print self.game.filename, ifile
-        d = tkinter.tkfiledialog.SaveAs()
+        d = tkinter.FileDialog.SaveAs()
         filename = d.show(filetypes=self.FILETYPES,
                           defaultextension=self.DEFAULTEXTENSION,
                           initialdir=idir, initialfile=ifile)
@@ -1508,7 +1508,7 @@ def mImportStartingLayout(self, *event):
             idir, ifile = "", ""
         if not idir:
             idir = self.app.dn.boards
-        d = tkinter.tkfiledialog.Open()
+        d = tkinter.FileDialog.Open()
         key = 'PYSOL_DEBUG_IMPORT'
         if key not in os.environ:
             filename = d.show(filetypes=self.FILETYPES,
@@ -1555,7 +1555,7 @@ def mSaveAs(self, *event):
         if not idir:
             idir = self.app.dn.savegames
         # print self.game.filename, ifile
-        d = tkinter.tkfiledialog.SaveAs()
+        d = tkinter.FileDialog.SaveAs()
         filename = d.show(filetypes=self.FILETYPES,
                           defaultextension=self.DEFAULTEXTENSION,
                           initialdir=idir, initialfile=ifile)
diff --git a/pysollib/winsystems/x11.py b/pysollib/winsystems/x11.py
index 496e5da59c..24e9989ea0 100644
--- a/pysollib/winsystems/x11.py
+++ b/pysollib/winsystems/x11.py
@@ -71,10 +71,10 @@ def init_root_window(root, app):
             except Exception:
                 traceback.print_exc()
             else:
-                import tkinter.tkfiledialog
-                tkinter.tkfiledialog.Open.command = 'ttk::getOpenFile'
-                tkinter.tkfiledialog.SaveAs.command = 'ttk::getSaveFile'
-                tkinter.tkfiledialog.Directory.command = 'ttk::chooseDirectory'
+                import tkinter.FileDialog
+                tkinter.FileDialog.Open.command = 'ttk::getOpenFile'
+                tkinter.FileDialog.SaveAs.command = 'ttk::getSaveFile'
+                tkinter.FileDialog.Directory.command = 'ttk::chooseDirectory'
 
         style = ttk.Style(root)
         color = style.lookup('.', 'background')

From 4f38e9698f6a994fe3ffaa579b665373454dda7a Mon Sep 17 00:00:00 2001
From: Alexandre Detiste <alexandre.detiste@gmail.com>
Date: Mon, 21 Oct 2024 01:07:28 +0200
Subject: [PATCH 3/3] fix filedialog <> FileDialog

---
 pysollib/kivy/menubar.py      |  2 +-
 pysollib/ui/tktile/menubar.py | 10 +++++-----
 pysollib/winsystems/x11.py    |  8 ++++----
 scripts/cardset_viewer.py     |  4 ++--
 4 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/pysollib/kivy/menubar.py b/pysollib/kivy/menubar.py
index f29adabcfb..e913984508 100644
--- a/pysollib/kivy/menubar.py
+++ b/pysollib/kivy/menubar.py
@@ -2092,7 +2092,7 @@ def mOpen(self, *event):
             idir, ifile = "", ""
         if not idir:
             idir = self.app.dn.savegames
-#        d = tkFileDialog.Open()
+#        d = tkinter.filedialog.Open()
 #        filename = d.show(filetypes=self.FILETYPES,
 #                          defaultextension=self.DEFAULTEXTENSION,
 #                          initialdir=idir, initialfile=ifile)
diff --git a/pysollib/ui/tktile/menubar.py b/pysollib/ui/tktile/menubar.py
index 62c1d57d85..a8bc22a85e 100644
--- a/pysollib/ui/tktile/menubar.py
+++ b/pysollib/ui/tktile/menubar.py
@@ -4,7 +4,7 @@
 import re
 import sys
 import tkinter
-import tkinter.FileDialog
+import tkinter.filedialog
 
 from pysollib.gamedb import GI
 from pysollib.hint import PySolHintLayoutImportError
@@ -1439,7 +1439,7 @@ def mOpen(self, *event):
             idir, ifile = "", ""
         if not idir:
             idir = self.app.dn.savegames
-        d = tkinter.FileDialog.Open()
+        d = tkinter.filedialog.Open()
         filename = d.show(filetypes=self.FILETYPES,
                           defaultextension=self.DEFAULTEXTENSION,
                           initialdir=idir, initialfile=ifile)
@@ -1476,7 +1476,7 @@ def mExportCurrentLayout(self, *event):
         if not idir:
             idir = self.app.dn.boards
         # print self.game.filename, ifile
-        d = tkinter.FileDialog.SaveAs()
+        d = tkinter.filedialog.SaveAs()
         filename = d.show(filetypes=self.FILETYPES,
                           defaultextension=self.DEFAULTEXTENSION,
                           initialdir=idir, initialfile=ifile)
@@ -1508,7 +1508,7 @@ def mImportStartingLayout(self, *event):
             idir, ifile = "", ""
         if not idir:
             idir = self.app.dn.boards
-        d = tkinter.FileDialog.Open()
+        d = tkinter.filedialog.Open()
         key = 'PYSOL_DEBUG_IMPORT'
         if key not in os.environ:
             filename = d.show(filetypes=self.FILETYPES,
@@ -1555,7 +1555,7 @@ def mSaveAs(self, *event):
         if not idir:
             idir = self.app.dn.savegames
         # print self.game.filename, ifile
-        d = tkinter.FileDialog.SaveAs()
+        d = tkinter.filedialog.SaveAs()
         filename = d.show(filetypes=self.FILETYPES,
                           defaultextension=self.DEFAULTEXTENSION,
                           initialdir=idir, initialfile=ifile)
diff --git a/pysollib/winsystems/x11.py b/pysollib/winsystems/x11.py
index 24e9989ea0..2b66f06dbd 100644
--- a/pysollib/winsystems/x11.py
+++ b/pysollib/winsystems/x11.py
@@ -71,10 +71,10 @@ def init_root_window(root, app):
             except Exception:
                 traceback.print_exc()
             else:
-                import tkinter.FileDialog
-                tkinter.FileDialog.Open.command = 'ttk::getOpenFile'
-                tkinter.FileDialog.SaveAs.command = 'ttk::getSaveFile'
-                tkinter.FileDialog.Directory.command = 'ttk::chooseDirectory'
+                import tkinter.filedialog
+                tkinter.filedialog.Open.command = 'ttk::getOpenFile'
+                tkinter.filedialog.SaveAs.command = 'ttk::getSaveFile'
+                tkinter.filedialog.Directory.command = 'ttk::chooseDirectory'
 
         style = ttk.Style(root)
         color = style.lookup('.', 'background')
diff --git a/scripts/cardset_viewer.py b/scripts/cardset_viewer.py
index b6b4c4fec0..793d9ffe0f 100755
--- a/scripts/cardset_viewer.py
+++ b/scripts/cardset_viewer.py
@@ -9,7 +9,7 @@
 
 import os
 import tkinter
-import tkinter.FileDialog
+import tkinter.filedialog
 from glob import glob
 
 from PIL import Image, ImageTk
@@ -174,7 +174,7 @@ def on_mousewheel(event):
 def select_dir():
     global data_dir
 
-    dialog = tkinter.FileDialog.Directory(root)
+    dialog = tkinter.filedialog.Directory(root)
     directory = dialog.show()
     if directory:
         data_dir = os.path.normpath(directory)
