Re: Ask for help about a tkinter problem
> On 2017-08-21 01:28, jf...@ms4.hinet.net wrote: >> Peter Otten at 2017/8/20 UTC+8 PM 5:52:24 wrote: > [snip] > >>> That is just a peculiarity of TCL; a "-" is added to the option by the >>> Python wrapper before passing it along >> >> This extra "-" confuses people when showing up in the Traceback info. >> Can't figure out why the author want to do this. >> > To clarify what Peter said, tkinter is a GUI library written in the Tcl > programming language. The Tcl GUI framework is tk, not tkinter. > The 'tkinter' module in Python's standard library is just a wrapper > around that library. tkinter abbreviates tk interface. In particular, it adds a Python class-based interface to tcl and tk functions and structures. > The "-" is added because the Tcl language requires it. -- https://mail.python.org/mailman/listinfo/python-list
Re: Ask for help about a tkinter problem
On 2017-08-21 01:28, jf...@ms4.hinet.net wrote: Peter Otten at 2017/8/20 UTC+8 PM 5:52:24 wrote: [snip] That is just a peculiarity of TCL; a "-" is added to the option by the Python wrapper before passing it along This extra "-" confuses people when showing up in the Traceback info. Can't figure out why the author want to do this. To clarify what Peter said, tkinter is a GUI library written in the Tcl programming language. The 'tkinter' module in Python's standard library is just a wrapper around that library. The Perl and Ruby programming languages also have wrappers. The "-" is added because the Tcl language requires it. -- https://mail.python.org/mailman/listinfo/python-list
Re: Ask for help about a tkinter problem
Peter Otten at 2017/8/20 UTC+8 PM 5:52:24 wrote: > jf...@ms4.hinet.net wrote: > > > I am running a tkinter tutor downloaded from web, > > https://github.com/daleathan/widget-tour-py3. there are two files > > involved: > > > > > > #file button.py > > > > from tkinter import * > > from tkinter.ttk import * > > import infrastructure > > ... > > class ButtonsDemoWindow( infrastructure.DemoWindow ): > > ... > > def __init__( self ): > > ... > > ... > > for c in ('Peach Puff', 'Light Blue', 'Sea Green', 'Yellow' ): > > b = Button(self.frame, text=c) > > b['command'] = infrastructure.callit( self.callback, c ) > > b.pack( side=TOP, expand=YES, pady=2 ) > > > > def callback(self, color): > > self.frame['background']=color > > > > def runDemo(): > > ButtonsDemoWindow() > > > > -- > > #file infrastructure.py > > ... > > class DemoWindow( Toplevel ): > > ... > > ... > > class callit: > > def __init__(self, function, *args ): > > self.f = function > > self.args = args > > > > def __call__(self, *ignored): > > self.f( *self.args) > > > > > > I run it under the DOS box: > > > > D:\Works\Python\widget-tour-py3-master>python > > Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 19:28:18) [MSC v.1600 > > 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or > > "license" for more information. > > >>> import button > > >>> button.runDemo() > > > > after the window shows up, I pressed one of the buttons and get the error > > below: > > > Exception in Tkinter callback > > Traceback (most recent call last): > > File "C:\Python34\lib\tkinter\__init__.py", line 1538, in __call__ > > return self.func(*args) > > File "D:\Works\Python\widget-tour-py3-master\infrastructure.py", line > > 216, in __call__ > > self.f( *self.args) > > File "D:\Works\Python\widget-tour-py3-master\button.py", line 39, in > > callback > > self.frame['background']=color > > File "C:\Python34\lib\tkinter\__init__.py", line 1331, in __setitem__ > > self.configure({key: value}) > > File "C:\Python34\lib\tkinter\__init__.py", line 1324, in configure > > return self._configure('configure', cnf, kw) > > File "C:\Python34\lib\tkinter\__init__.py", line 1315, in _configure > > self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) > > _tkinter.TclError: unknown option "-background" > > > > > > When I looked into the file tkinter\__init__.py, I found there is codes > > which add conditionally a '-' onto the original cnf argument: > > That is just a peculiarity of TCL; a "-" is added to the option by the > Python wrapper before passing it along > > > 1305 def _configure(self, cmd, cnf, kw): > > 1306 """Internal function.""" > > ... > > ... > > 1313 if isinstance(cnf, str): > > 1314 return self._getconfigure1(_flatten((self._w, cmd, > > '-'+cnf))) > > > > Is it the reason this exception raised? Why is that? > > I can confirm the problem. It looks like the bug was introduced when the > example was converted from stock tkinter to the new ttk widget set. > > While > > frame["background"] = color > > works when frame is a tkinter.Frame widget the newer tkinter.ttk.Frame > widget uses "styles" to configure its appearance. > > I have not used that new feature, but with the help of > > http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/ttk-style-layer.html > > and some trial and error I modified the example to use a style: > > $ diff -u button.py button_fixed.py > --- button.py 2017-08-20 11:44:33.841839812 +0200 > +++ button_fixed.py 2017-08-20 11:44:04.032426163 +0200 > @@ -25,7 +25,9 @@ > > infrastructure.DemoWindow.__init__(self, intro, 'button.py' ) > > -self.frame=Frame(self) > +self.style = Style(self) > +self.frame=Frame(self, style="foo.TFrame") > + > self.frame.pack(expand=YES, fill=BOTH ) > for c in ('Peach Puff', 'Light Blue', >'Sea Green', 'Yellow' ): > @@ -36,7 +38,7 @@ > > > def callback(self, color): > -self.frame['background']=color > +self.style.configure("foo.TFrame", background=color) > > > def runDemo(): > $ > > However, I'm not sure if this is the canonical way to write it... Thank you for your answer. I try not to use the ttk by comment the line "from tkinter.ttk import *", and also try your "Style" modification codes, both work:-) > That is just a peculiarity of TCL; a "-" is added to the option by the > Python wrapper before passing it along This extra "-" confuses people when showing up in the Traceback info. Can't figure out why the author want to do this. --Jach -- https://mail.python.org/mailman/listinfo/python-list
Re: Ask for help about a tkinter problem
jf...@ms4.hinet.net wrote: > I am running a tkinter tutor downloaded from web, > https://github.com/daleathan/widget-tour-py3. there are two files > involved: > > > #file button.py > > from tkinter import * > from tkinter.ttk import * > import infrastructure > ... > class ButtonsDemoWindow( infrastructure.DemoWindow ): > ... > def __init__( self ): > ... > ... > for c in ('Peach Puff', 'Light Blue', 'Sea Green', 'Yellow' ): > b = Button(self.frame, text=c) > b['command'] = infrastructure.callit( self.callback, c ) > b.pack( side=TOP, expand=YES, pady=2 ) > > def callback(self, color): > self.frame['background']=color > > def runDemo(): > ButtonsDemoWindow() > > -- > #file infrastructure.py > ... > class DemoWindow( Toplevel ): > ... > ... > class callit: > def __init__(self, function, *args ): > self.f = function > self.args = args > > def __call__(self, *ignored): > self.f( *self.args) > > > I run it under the DOS box: > > D:\Works\Python\widget-tour-py3-master>python > Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 19:28:18) [MSC v.1600 > 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or > "license" for more information. > >>> import button > >>> button.runDemo() > > after the window shows up, I pressed one of the buttons and get the error > below: > Exception in Tkinter callback > Traceback (most recent call last): > File "C:\Python34\lib\tkinter\__init__.py", line 1538, in __call__ > return self.func(*args) > File "D:\Works\Python\widget-tour-py3-master\infrastructure.py", line > 216, in __call__ > self.f( *self.args) > File "D:\Works\Python\widget-tour-py3-master\button.py", line 39, in > callback > self.frame['background']=color > File "C:\Python34\lib\tkinter\__init__.py", line 1331, in __setitem__ > self.configure({key: value}) > File "C:\Python34\lib\tkinter\__init__.py", line 1324, in configure > return self._configure('configure', cnf, kw) > File "C:\Python34\lib\tkinter\__init__.py", line 1315, in _configure > self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) > _tkinter.TclError: unknown option "-background" > > > When I looked into the file tkinter\__init__.py, I found there is codes > which add conditionally a '-' onto the original cnf argument: That is just a peculiarity of TCL; a "-" is added to the option by the Python wrapper before passing it along > 1305 def _configure(self, cmd, cnf, kw): > 1306 """Internal function.""" > ... > ... > 1313 if isinstance(cnf, str): > 1314 return self._getconfigure1(_flatten((self._w, cmd, > '-'+cnf))) > > Is it the reason this exception raised? Why is that? I can confirm the problem. It looks like the bug was introduced when the example was converted from stock tkinter to the new ttk widget set. While frame["background"] = color works when frame is a tkinter.Frame widget the newer tkinter.ttk.Frame widget uses "styles" to configure its appearance. I have not used that new feature, but with the help of http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/ttk-style-layer.html and some trial and error I modified the example to use a style: $ diff -u button.py button_fixed.py --- button.py 2017-08-20 11:44:33.841839812 +0200 +++ button_fixed.py 2017-08-20 11:44:04.032426163 +0200 @@ -25,7 +25,9 @@ infrastructure.DemoWindow.__init__(self, intro, 'button.py' ) -self.frame=Frame(self) +self.style = Style(self) +self.frame=Frame(self, style="foo.TFrame") + self.frame.pack(expand=YES, fill=BOTH ) for c in ('Peach Puff', 'Light Blue', 'Sea Green', 'Yellow' ): @@ -36,7 +38,7 @@ def callback(self, color): -self.frame['background']=color +self.style.configure("foo.TFrame", background=color) def runDemo(): $ However, I'm not sure if this is the canonical way to write it... -- https://mail.python.org/mailman/listinfo/python-list
Ask for help about a tkinter problem
I am running a tkinter tutor downloaded from web, https://github.com/daleathan/widget-tour-py3. there are two files involved: #file button.py from tkinter import * from tkinter.ttk import * import infrastructure ... class ButtonsDemoWindow( infrastructure.DemoWindow ): ... def __init__( self ): ... ... for c in ('Peach Puff', 'Light Blue', 'Sea Green', 'Yellow' ): b = Button(self.frame, text=c) b['command'] = infrastructure.callit( self.callback, c ) b.pack( side=TOP, expand=YES, pady=2 ) def callback(self, color): self.frame['background']=color def runDemo(): ButtonsDemoWindow() -- #file infrastructure.py ... class DemoWindow( Toplevel ): ... ... class callit: def __init__(self, function, *args ): self.f = function self.args = args def __call__(self, *ignored): self.f( *self.args) I run it under the DOS box: D:\Works\Python\widget-tour-py3-master>python Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 19:28:18) [MSC v.1600 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import button >>> button.runDemo() after the window shows up, I pressed one of the buttons and get the error below: >>> Exception in Tkinter callback Traceback (most recent call last): File "C:\Python34\lib\tkinter\__init__.py", line 1538, in __call__ return self.func(*args) File "D:\Works\Python\widget-tour-py3-master\infrastructure.py", line 216, in __call__ self.f( *self.args) File "D:\Works\Python\widget-tour-py3-master\button.py", line 39, in callback self.frame['background']=color File "C:\Python34\lib\tkinter\__init__.py", line 1331, in __setitem__ self.configure({key: value}) File "C:\Python34\lib\tkinter\__init__.py", line 1324, in configure return self._configure('configure', cnf, kw) File "C:\Python34\lib\tkinter\__init__.py", line 1315, in _configure self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) _tkinter.TclError: unknown option "-background" When I looked into the file tkinter\__init__.py, I found there is codes which add conditionally a '-' onto the original cnf argument: 1305 def _configure(self, cmd, cnf, kw): 1306 """Internal function.""" ... ... 1313 if isinstance(cnf, str): 1314 return self._getconfigure1(_flatten((self._w, cmd, '-'+cnf))) Is it the reason this exception raised? Why is that? Best Regards, Jach Fong -- https://mail.python.org/mailman/listinfo/python-list