Skip to content

IDLE: use ttk.spinbox with configdialog #78143

Closed

Description

@terryjreedy
BPO 33962
Nosy @terryjreedy, @roseman, @serhiy-storchaka, @csabella, @miss-islington
PRs
  • gh-78143: IDLE - replace config dlg scale with ttk spinbox #22954
  • [3.10] bpo-33962: Use ttk spinbox for IDLE indent space config (GH-22954) #26647
  • [3.9] bpo-33962: Use ttk spinbox for IDLE indent space config (GH-22954) #26648
  • Files
  • tkversions.png
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = 'https://github.com/terryjreedy'
    closed_at = <Date 2021-06-10.20:20:10.148>
    created_at = <Date 2018-06-26.03:29:08.191>
    labels = ['expert-IDLE', 'type-feature', '3.9', '3.10', '3.11']
    title = 'IDLE: use ttk.spinbox with configdialog'
    updated_at = <Date 2021-06-10.20:20:10.146>
    user = 'https://github.com/terryjreedy'

    bugs.python.org fields:

    activity = <Date 2021-06-10.20:20:10.146>
    actor = 'terry.reedy'
    assignee = 'terry.reedy'
    closed = True
    closed_date = <Date 2021-06-10.20:20:10.148>
    closer = 'terry.reedy'
    components = ['IDLE']
    creation = <Date 2018-06-26.03:29:08.191>
    creator = 'terry.reedy'
    dependencies = []
    files = ['49540']
    hgrepos = []
    issue_num = 33962
    keywords = ['patch']
    message_count = 10.0
    messages = ['320465', '320499', '320501', '379560', '379582', '379611', '395562', '395565', '395568', '395569']
    nosy_count = 5.0
    nosy_names = ['terry.reedy', 'markroseman', 'serhiy.storchaka', 'cheryl.sabella', 'miss-islington']
    pr_nums = ['22954', '26647', '26648']
    priority = 'normal'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = 'enhancement'
    url = 'https://bugs.python.org/issue33962'
    versions = ['Python 3.9', 'Python 3.10', 'Python 3.11']

    Activity

    1. terryjreedy commented on Jun 26, 2018

      @terryjreedy
      MemberAuthor

      Spinoff from bpo-27755, which has a image of tk and ttk versions of a spinbox on Mac and asks about using ttk.spinbox.

      ttk Spinbox was added to tcl/tk in 8.5.9 and to tkinter.ttk in 3.7. I believe there are three cases to consider.
      tcl/tk python action

      = 8.5.9 >=3.7 from tkinter.tkk import Spinbox
      = 8.5.9 3.6 import Entry and copy class Spinbox(Entry) code
      < 8.5.9 from tkinter import Spinbox

      Serhiy, is tcl/tk < 8.5.9 something we realistically need to worry about, on Linux?

      In Dec 2018 or Jan 2019, when 3.6 switches to security fixes only, the 3.6 code can be deleted.

      For the present, only use config options in the common subset:
      cursor, takefocus, validate, validatecommond, invalidcommand,
      xscrollcommand, command, to, from_, increment, values, wrap, format.
      Is this sufficient?

      Whenever we make 8.5.9 or later a requirement, the tkinter Spinbox can be dropped and the class and style options used. Or we can subclass tkinter.Spinbox and accept and somehow deal with class and style options. (We are not presently using custom styles.)

      For the present, the code can go in query.py, presently only 300 lines. When we only need to cater to 3.7+ and 8.5.9+, the code will be replaced by normal import from ttk.

      Comman methods: identify, bbox, delete, icursor, index, insert, get.
      ttk has set, while tk sets through a textvariable. If we subclass tk.spinbox, it could have a set method that uses a private Var.

      Do the universal widget methods listed on http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/universal.html
      all apply to ttk widgets?
      identify,

    2. self-assigned this
      on Jun 26, 2018
    3. roseman commented on Jun 26, 2018

      rosemanmannequin
      Mannequin

      For now, using a (likely very minimal) subset of commands/options common to both classic and ttk spinbox versions in IDLE sounds good.

      I was originally thinking stick with "-textvariable" for setting (which works on both) but I like your idea of adding "set" to a tk.spinbox subclass.

    4. terryjreedy commented on Jun 26, 2018

      @terryjreedy
      MemberAuthor

      ttk.Spinbox inherits from ttk.Entry. My option list left out the options for Entry, which is one of the ttk widget not in the doc. The additional entry options include exportselection, justify, show, state, textvariable, and width.
      https://www.tcl.tk/man/tcl8.6/TkCmd/ttk_spinbox.htm
      explicitly says textvariable is supported. This is important because configdialog uses tracers on Var to detect and record user changes.

    5. changed the title [-]IDLE: use ttk.spinbox[/-] [+]IDLE: use ttk.spinbox with configdialog[/+] on Sep 24, 2018
    6. terryjreedy commented on Oct 25, 2020

      @terryjreedy
      MemberAuthor

      bpo-27755 was about replacing uses of our custom DynOptionMenu with ttk.Combobox, which I believe we can do now, wherever we don't replace it with something else. One use is for font size choice; Spinbox was suggested as an alternative replacement.

      Spinbox was also proposed somewhere else to remplace the indent size Label scale. But I/we had decided, somewhere, to use a simple entry box, like those for entering counts on the General tab, with validation limits of 1 and 16, and move the choice to the General tab. (If we don't have validate(min, max) function, should make one.) SO

      The transfer cannot be done until the General tab is split into 2, as it is now too long (does not fix on Macbook Air -- cannot see buttons). I think General windows preferences (where indent should go) + help resources for 1, Specific Editor only or Shell only for other. Not sure of names.

      This all said, I tried out the patch. The spinbox appears to be an Entry with added arrows. If it worked right, it could be used for some other int entries instead of plain Entry. But in some ways, it seems partly worse than Entry.
      0. No doc in Shipman (written before 8.5.9); must use tk doc.

      1. Expands to space available; is Entry char width really disabled?
      2. Deleting digit to replace it generates 2 TclErrors*.
      3. Clicking arrow 'selects' entry. Patch used text selection, but my dark theme select looks awful for single digit. We can fix this with different config.
      * ...
        File "f:\dev\3x\lib\tkinter\__init__.py", line 536, in get
          return self._tk.getint(value)
      _tkinter.TclError: expected integer but got ""
      During handling of the above exception, another exception occurred:
      ...
        File "f:\dev\3x\lib\tkinter\__init__.py", line 538, in get
          return int(self._tk.getdouble(value))
      _tkinter.TclError: expected floating-point number but got ""

      I will look more later.

    7. roseman commented on Oct 25, 2020

      rosemanmannequin
      Mannequin

      Whoops, sorry... there's a "readonly" state flag that disables direct editing of the entry (like with combobox) and just allows manipulation of the arrows. I've updated the PR to set that. I've also changed it so that the contents of the entry part isn't selected whenever the arrows are used (agreed, it looks ugly). Please give it a try and let me know.

      p.s. I just checked, the entry's width configuration option works. You just have to remove the "fill=X" when the widget is packed. FWIW, I kept the previous layout to keep the patch as minimal as possible, under the assumption that other layout changes (here, on in general) were planned.

    8. roseman commented on Oct 25, 2020

      rosemanmannequin
      Mannequin

      Just as a side note for Terry and anyone else testing on macOS... the recent updates in Tk have smoothed out many of the appearance issues for the classic widgets. See the attached screen shot tkversions.png comparing 8.6.9 with the current trunk of the Tk repo. Notice things like the background color around the optionmenu aren't as jarring on the newer Tk versions.

      Having said that, I'll likely stick with the older ones for development purposes, just because the blemishes with the classic widgets and other things are so much more noticeable!

      Incidentally, if you've got several versions of Tcl/Tk on your system, you can use /usr/bin/install_name_tool to point the Tkinter shared library at the one you want to use. Use like "install_name_tool -change OLD NEW file", e.g.:
      install_name_tool -change /Library/Frameworks/Tk.framework/Versions/8.6/Tk /Users/roseman/tmp/tcl86core/Library/Frameworks/Tk.framework/Versions/8.6/Tk build/lib.macosx-10.15-x86_64-3.10/_tkinter.cpython-310-darwin.so

    9. terryjreedy commented on Jun 10, 2021

      @terryjreedy
      MemberAuthor

      New changeset 42d5a4f by Mark Roseman in branch 'main':
      bpo-33962: Use ttk spinbox for IDLE indent space config (GH-22954)
      42d5a4f

    10. miss-islington commented on Jun 10, 2021

      @miss-islington
      Contributor

      New changeset 9b88943 by Miss Islington (bot) in branch '3.9':
      bpo-33962: Use ttk spinbox for IDLE indent space config (GH-22954)
      9b88943

    11. terryjreedy commented on Jun 10, 2021

      @terryjreedy
      MemberAuthor

      New changeset 540ebc4 by Miss Islington (bot) in branch '3.10':
      bpo-33962: Use ttk spinbox for IDLE indent space config (GH-22954)
      540ebc4

    12. 4 remaining items

    13. transferred this issue fromon Apr 10, 2022
    14. terryjreedy commented on Aug 15, 2022

      @terryjreedy
      MemberAuthor

      #22954 also moved the indent setting to the new Windows tab, but neglected to remove 'Tab' from the Font tab. The new PR fixes this.

    15. added 2 commits that reference this issue on Aug 15, 2022
    16. added 4 commits that reference this issue on Aug 15, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    Labels

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions