Re: Ask for help about a tkinter problem

2017-08-21 Thread Terry Reedy

> 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

2017-08-20 Thread MRAB

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

2017-08-20 Thread jfong
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

2017-08-20 Thread Peter Otten
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

2017-08-20 Thread jfong
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