Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IDLE: use ttk.spinbox with configdialog #78143

terryjreedy opened this issue Jun 26, 2018 · 10 comments

IDLE: use ttk.spinbox with configdialog #78143

terryjreedy opened this issue Jun 26, 2018 · 10 comments


Copy link

@terryjreedy terryjreedy commented Jun 26, 2018

BPO 33962
Nosy @terryjreedy, @roseman, @serhiy-storchaka, @csabella, @miss-islington
  • #22954
  • #26647
  • #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 = ''
    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 = '' 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 = ''
    versions = ['Python 3.9', 'Python 3.10', 'Python 3.11']

    Copy link
    Member Author

    @terryjreedy terryjreedy commented Jun 26, 2018

    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, 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
    all apply to ttk widgets?

    @terryjreedy terryjreedy self-assigned this Jun 26, 2018
    @terryjreedy terryjreedy added expert-IDLE type-feature labels Jun 26, 2018
    Copy link

    @roseman roseman mannequin commented Jun 26, 2018

    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.

    Copy link
    Member Author

    @terryjreedy terryjreedy commented Jun 26, 2018

    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.
    explicitly says textvariable is supported. This is important because configdialog uses tracers on Var to detect and record user changes.

    @terryjreedy terryjreedy changed the title IDLE: use ttk.spinbox IDLE: use ttk.spinbox with configdialog Sep 24, 2018
    Copy link
    Member Author

    @terryjreedy terryjreedy commented Oct 25, 2020

    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\", 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\", line 538, in get
        return int(self._tk.getdouble(value))
    _tkinter.TclError: expected floating-point number but got ""

    I will look more later.

    Copy link

    @roseman roseman mannequin commented Oct 25, 2020

    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.

    Copy link

    @roseman roseman mannequin commented Oct 25, 2020

    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/

    Copy link
    Member Author

    @terryjreedy terryjreedy commented Jun 10, 2021

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

    Copy link

    @miss-islington miss-islington commented Jun 10, 2021

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

    Copy link
    Member Author

    @terryjreedy terryjreedy commented Jun 10, 2021

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

    Copy link
    Member Author

    @terryjreedy terryjreedy commented Jun 10, 2021

    Mark, I am not sure what last comment meant, but we generally only test IDLE with 3.x with the 8.6.y that comes with 3.x. Ned Deily sometimes runs gui tests with various tcl/tk versions and builds to select one for the installer, but he knows about whatever you said ;-).

    Thank you for the patch.

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    None yet

    No branches or pull requests

    2 participants