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
Tkinter error when opening IDLE configuration menu (Tcl/Tk 8.6) #70860
Comments
I'm using Python 3.5.1 on Arch Linux. I've restalled the python package which provides IDLE, and the tkinter package which is used by IDLE, but to no effect. My problem is this: When in the menu at the top in IDLE, I click on Options -> Configure IDLE, the menu will stop responding, and nothing happens after that. Doing this when I run IDLE in a terminal provides the following error on clicking Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.5/tkinter/__init__.py", line 1549, in __call__
return self.func(*args)
File "/usr/lib/python3.5/idlelib/EditorWindow.py", line 516, in config_dialog
configDialog.ConfigDialog(self.top,'Settings')
File "/usr/lib/python3.5/idlelib/configDialog.py", line 74, in __init__
self.LoadConfigs()
File "/usr/lib/python3.5/idlelib/configDialog.py", line 1086, in LoadConfigs
self.LoadFontCfg()
File "/usr/lib/python3.5/idlelib/configDialog.py", line 988, in LoadFontCfg
self.SetFontSample()
File "/usr/lib/python3.5/idlelib/configDialog.py", line 866, in SetFontSample
self.labelFontSample.config(font=newFont)
File "/usr/lib/python3.5/tkinter/__init__.py", line 1330, in configure
return self._configure('configure', cnf, kw)
File "/usr/lib/python3.5/tkinter/__init__.py", line 1321, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: expected integer but got "" I have no idea what to do here. |
I'm having the problem if I'm running idle with Python 2.7.11 too. |
Serhiy, what do you make of the TclError? Could it be an ArchLinux-specific bug in tk? Here is the entire function: def SetFontSample(self, event=None):
fontName = self.fontName.get()
fontWeight = tkFont.BOLD if self.fontBold.get() else tkFont.NORMAL
newFont = (fontName, self.fontSize.get(), fontWeight)
self.labelFontSample.config(font=newFont)
self.textHighlightSample.configure(font=newFont) The first 3 lines were last touched on 2014-08-03, the last 3 on 2012-10-22. The code seem unexceptional. This works fine for me and, I presume, most everyone else. wysaard: What tk version does Arch Linux provide you? Check Help => About IDLE before you hit configure. |
In the screen of Trying to find any related bug reports on the Arch Linux bug tracker I found something linking to this (open) issue: https://bugs.python.org/issue24951 It seems to have something to do with a config file. Maybe there's something broken in there, or perhaps a something is missing? |
I just fixed this problem. In my ~/.idlerc/ folder there was no After doing that everything worked fine again. I'm not sure where this bug came from though, whether it's my package manager, or some bug in IDLE itself that created this problem; I also don't know if this is normal behavior for a missing config file; so I do n't know whether to close this or not, so I'll leave that to you. |
I should have thought of .idlerc as being a possible problem. The usual fix is to delete its contents. For this tracker, exiting with a traceback is a behavior issue; a crash is something worse, a core dump or whatever the MAC equivalent is. .idlerc should not have config-main.cfg unless you change one of the values in idlelib/config-main.def. If you change anything, the redundant entries will be removed. Similarly for the other .idlerc/.cfg versus idlelib/.def files. So missing that file should not have been a problem. But it might have been if idlelib/config-main.def is corrupt. I suggest you check it. However, it it were, I would expect IDLE startup to fail, but it did not. Since .idlerc is common to all installed version of Python, and hence to all IDLEs, it is not touched by installation or removal of any particular version. The file you copied is perhaps a decade old. However, the only changes should be [EditorWindow] The third is needed if you select the new IDLE Dark color theme. In ConfigDialog, self.fontSize is a StringVar, so it would seem that the error was it being '' rather than something like '10'. Since you have 'fixed' the problem, I don't anticipate being to verify what its value was or why. Hence I will close this. However, feel free to post additional relevant information. (Interpret 'Not a bug' here as 'cause unknown' ;-). |
For some reason the freshly downloaded files have this problem too. If I remove my config-main.def and let my package manager get a new one it breaks again. I don't really know the implications of this; is this just a problem with my particular setup or does this mean that maybe the file in the package is invalid? |
I can reproduce this with Python 2.7.11 and somewhat recent build from hg default (3.6.0a0) on Fedora 23.
idlelib/config-main.def has a different default::
Putting that value in my personal config-main.cfg makes the bug manifest itself again. I hacked the code to get the values used in the line,
0.139719021045736.139719021045880' For the good case ("courier" font):
The difference is indeed that it's getting an empty string for the font size. At this point I'm not sure how to investigate further. Could someone more familiar with Tk look at the issue? I'll be happy to provide more information. (Hopefully bugs.python.org notifications reach my inbox.) |
bpo-24745 changed the default fixed font from Courier to TkFixedFontin 3.5.0, 3.4.4, and 2.7.11 when using tcl/tk 8.5+. On some OSes, the latter is not Courier and looks much better. I don't know why the two behave differently on some systems. Since this is not a unique problem on one machine, I am reopening this to at least provide a workaround. Regardless of ultimate cause, we can at least force a blank font size to a default int string, such as '10'. I closed bpo-24951 as a duplicate of this. In class idlelib.configDialog.ConfigDialog, method CreatePageFontTab (line 114) creates StringVar self.fontSize, initialized to ''. The Var is passed to class dynOptionMenuWidget.DynOptionMenu(tkinter.OptionMenu). The instance is bound to self.optMenuFontSize. Method LoadFontCfg (line 963) sets retrieves the current Editor font as local name configeredFont and local fontSize therefrom. It passes fontSize to self.optMenuFontSize.SetMenu. This in turns sets the stored self.fontSize to the passed in fontSize, overwriting the initial value. (The OptionMenu.__init__ docstring and http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/optionmenu.html suggest that the variable must be a StringVar, which I presume is why self.fontSize is. Experiment suggest otherwise in 8.6. This would have to be verified on 8.5 and even 8.4 before changing to IntVar.) If my understanding based on the above, fontSize must be set to '' when the current font is TkFixedFont, but not when the font is Courier. Petr, could you confirm by adding "print(configuredFont, fontsize)" to LoadFontCfg after both names are set and running both buggy and good cases? |
buggy: good: |
Thank you. I believe a see a bug in configHandler.)idleConf.GetFont(self, 'main', 'EditorWindow') returning a size of 0. Could you post the result of running the following for the bad case? import tkinter as tk
from tkinter.font import Font
root=tk.Tk()
f = Font(name='TkFixedFont', exists=True, root=root)
print(Font.actual(f)) There is still a question of how fontSize=0 becomes self.fontSize=='', but that will not matter when fontSize=0 is prevented. |
Indeed, the size is 0 there: {'family': 'DejaVu Sans Mono', 'size': 0, 'slant': 'roman', 'weight': 'normal', 'overstrike': 0, 'underline': 0} |
Seen on Debian and Ubuntu as well. All these distros have in common to use Tcl/Tk 8.6. |
using this as a work-around, not tested with Tcl/Tk 8.5 or older. --- a/Lib/idlelib/configDialog.py
+++ b/Lib/idlelib/configDialog.py
@@ -113,7 +113,11 @@ class ConfigDialog(Toplevel):
def CreatePageFontTab(self):
parent = self.parent
- self.fontSize = StringVar(parent)
+ # see issue python/cpython#70860
+ if TkVersion >= 8.6:
+ self.fontSize = IntVar(parent)
+ else:
+ self.fontSize = StringVar(parent)
self.fontBold = BooleanVar(parent)
self.fontName = StringVar(parent)
self.spaceNum = IntVar(parent) |
Mark, changing the default font from Courier to TkFixedFont has introduced or exposed a bug in any of IDLE, tkinter, or tk 8.6.4 on Linux. The result is that trying to open the configuration menu fails with TclError. What do your think is the best solution? Mathias, it seems to me that fontsize should alsways be an Intvar. I have no idea why StringVar is used, except possibly as a workaround when the code was written. |
Anyone seeing problem: In /Lib/idlelib/configHandler.py, about line 685, in "if size < 0:", change '<' to '<='. Remove the workaround of overriding 'TkFixedFont' with 'courier'. Does this fix the problem? |
Terry J. Reedy: That fixes the problem for me! |
New changeset a873265366ba by Terry Jan Reedy in branch '2.7': New changeset 1464df337152 by Terry Jan Reedy in branch '3.5': |
I would like to change the code a bit more (like using IntVar for size everywhere), but I don't want to do so without tests. The problem is that tk variables and font functions require a root window and none of the linux buildbots allow that. (They all run 'headless'.) |
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:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: