Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
568b223c
Commit
568b223c
authored
Mar 09, 2016
by
Serhiy Storchaka
Browse files
Options
Browse Files
Download
Plain Diff
Issue #26177: Fixed the keys() method for Canvas and Scrollbar widgets.
parents
1a18fec3
6897de31
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
183 additions
and
138 deletions
+183
-138
Lib/tkinter/__init__.py
Lib/tkinter/__init__.py
+3
-2
Lib/tkinter/test/test_tkinter/test_geometry_managers.py
Lib/tkinter/test/test_tkinter/test_geometry_managers.py
+6
-0
Lib/tkinter/test/test_tkinter/test_widgets.py
Lib/tkinter/test/test_tkinter/test_widgets.py
+11
-2
Lib/tkinter/test/test_ttk/test_widgets.py
Lib/tkinter/test/test_ttk/test_widgets.py
+134
-134
Lib/tkinter/test/widget_tests.py
Lib/tkinter/test/widget_tests.py
+27
-0
Misc/NEWS
Misc/NEWS
+2
-0
No files found.
Lib/tkinter/__init__.py
View file @
568b223c
...
...
@@ -1336,8 +1336,9 @@ class Misc:
self.configure({key: value})
def keys(self):
"""Return a list of all resource names of this widget."""
return [x[0][1:] for x in
self.tk.splitlist(self.tk.call(self._w, 'configure'))]
splitlist = self.tk.splitlist
return [splitlist(x)[0][1:] for x in
splitlist(self.tk.call(self._w, 'configure'))]
def __str__(self):
"""Return the window path name of this widget."""
return self._w
...
...
Lib/tkinter/test/test_tkinter/test_geometry_managers.py
View file @
568b223c
...
...
@@ -12,6 +12,8 @@ requires('gui')
class
PackTest
(
AbstractWidgetTest
,
unittest
.
TestCase
):
test_keys
=
None
def
create2
(
self
):
pack
=
tkinter
.
Toplevel
(
self
.
root
,
name
=
'pack'
)
pack
.
wm_geometry
(
'300x200+0+0'
)
...
...
@@ -276,6 +278,8 @@ class PackTest(AbstractWidgetTest, unittest.TestCase):
class
PlaceTest
(
AbstractWidgetTest
,
unittest
.
TestCase
):
test_keys
=
None
def
create2
(
self
):
t
=
tkinter
.
Toplevel
(
self
.
root
,
width
=
300
,
height
=
200
,
bd
=
0
)
t
.
wm_geometry
(
'300x200+0+0'
)
...
...
@@ -478,6 +482,8 @@ class PlaceTest(AbstractWidgetTest, unittest.TestCase):
class
GridTest
(
AbstractWidgetTest
,
unittest
.
TestCase
):
test_keys
=
None
def
tearDown
(
self
):
cols
,
rows
=
self
.
root
.
grid_size
()
for
i
in
range
(
cols
+
1
):
...
...
Lib/tkinter/test/test_tkinter/test_widgets.py
View file @
568b223c
...
...
@@ -103,7 +103,7 @@ class FrameTest(AbstractToplevelTest, unittest.TestCase):
'background'
,
'borderwidth'
,
'class'
,
'colormap'
,
'container'
,
'cursor'
,
'height'
,
'highlightbackground'
,
'highlightcolor'
,
'highlightthickness'
,
'relief'
,
'takefocus'
,
'visual'
,
'width'
,
'
padx'
,
'pady'
,
'
relief'
,
'takefocus'
,
'visual'
,
'width'
,
)
def
create
(
self
,
**
kwargs
):
...
...
@@ -637,7 +637,7 @@ class CanvasTest(AbstractWidgetTest, unittest.TestCase):
'highlightbackground'
,
'highlightcolor'
,
'highlightthickness'
,
'insertbackground'
,
'insertborderwidth'
,
'insertofftime'
,
'insertontime'
,
'insertwidth'
,
'relief'
,
'scrollregion'
,
'
offset'
,
'
relief'
,
'scrollregion'
,
'selectbackground'
,
'selectborderwidth'
,
'selectforeground'
,
'state'
,
'takefocus'
,
'xscrollcommand'
,
'xscrollincrement'
,
...
...
@@ -659,6 +659,15 @@ class CanvasTest(AbstractWidgetTest, unittest.TestCase):
widget
=
self
.
create
()
self
.
checkBooleanParam
(
widget
,
'confine'
)
def
test_offset
(
self
):
widget
=
self
.
create
()
self
.
assertEqual
(
widget
[
'offset'
],
'0,0'
)
self
.
checkParams
(
widget
,
'offset'
,
'n'
,
'ne'
,
'e'
,
'se'
,
's'
,
'sw'
,
'w'
,
'nw'
,
'center'
)
self
.
checkParam
(
widget
,
'offset'
,
'10,20'
)
self
.
checkParam
(
widget
,
'offset'
,
'#5,6'
)
self
.
checkInvalidParam
(
widget
,
'offset'
,
'spam'
)
def
test_scrollregion
(
self
):
widget
=
self
.
create
()
self
.
checkParam
(
widget
,
'scrollregion'
,
'0 0 200 150'
)
...
...
Lib/tkinter/test/test_ttk/test_widgets.py
View file @
568b223c
...
...
@@ -187,7 +187,7 @@ class AbstractLabelTest(AbstractWidgetTest):
@
add_standard_options
(
StandardTtkOptionsTests
)
class
LabelTest
(
AbstractLabelTest
,
unittest
.
TestCase
):
OPTIONS
=
(
'anchor'
,
'background'
,
'anchor'
,
'background'
,
'borderwidth'
,
'class'
,
'compound'
,
'cursor'
,
'font'
,
'foreground'
,
'image'
,
'justify'
,
'padding'
,
'relief'
,
'state'
,
'style'
,
'takefocus'
,
'text'
,
'textvariable'
,
...
...
@@ -208,7 +208,8 @@ class LabelTest(AbstractLabelTest, unittest.TestCase):
class
ButtonTest
(
AbstractLabelTest
,
unittest
.
TestCase
):
OPTIONS
=
(
'class'
,
'command'
,
'compound'
,
'cursor'
,
'default'
,
'image'
,
'state'
,
'style'
,
'takefocus'
,
'text'
,
'textvariable'
,
'image'
,
'padding'
,
'state'
,
'style'
,
'takefocus'
,
'text'
,
'textvariable'
,
'underline'
,
'width'
,
)
...
...
@@ -232,7 +233,7 @@ class CheckbuttonTest(AbstractLabelTest, unittest.TestCase):
'class'
,
'command'
,
'compound'
,
'cursor'
,
'image'
,
'offvalue'
,
'onvalue'
,
'state'
,
'style'
,
'
padding'
,
'
state'
,
'style'
,
'takefocus'
,
'text'
,
'textvariable'
,
'underline'
,
'variable'
,
'width'
,
)
...
...
@@ -275,138 +276,11 @@ class CheckbuttonTest(AbstractLabelTest, unittest.TestCase):
cbtn
.
tk
.
globalgetvar
(
cbtn
[
'variable'
]))
@
add_standard_options
(
IntegerSizeTests
,
StandardTtkOptionsTests
)
class
ComboboxTest
(
AbstractWidgetTest
,
unittest
.
TestCase
):
OPTIONS
=
(
'class'
,
'cursor'
,
'exportselection'
,
'height'
,
'justify'
,
'postcommand'
,
'state'
,
'style'
,
'takefocus'
,
'textvariable'
,
'values'
,
'width'
,
)
def
setUp
(
self
):
super
().
setUp
()
self
.
combo
=
self
.
create
()
def
create
(
self
,
**
kwargs
):
return
ttk
.
Combobox
(
self
.
root
,
**
kwargs
)
def
test_height
(
self
):
widget
=
self
.
create
()
self
.
checkParams
(
widget
,
'height'
,
100
,
101.2
,
102.6
,
-
100
,
0
,
'1i'
)
def
test_state
(
self
):
widget
=
self
.
create
()
self
.
checkParams
(
widget
,
'state'
,
'active'
,
'disabled'
,
'normal'
)
def
_show_drop_down_listbox
(
self
):
width
=
self
.
combo
.
winfo_width
()
self
.
combo
.
event_generate
(
'<ButtonPress-1>'
,
x
=
width
-
5
,
y
=
5
)
self
.
combo
.
event_generate
(
'<ButtonRelease-1>'
,
x
=
width
-
5
,
y
=
5
)
self
.
combo
.
update_idletasks
()
def
test_virtual_event
(
self
):
success
=
[]
self
.
combo
[
'values'
]
=
[
1
]
self
.
combo
.
bind
(
'<<ComboboxSelected>>'
,
lambda
evt
:
success
.
append
(
True
))
self
.
combo
.
pack
()
self
.
combo
.
wait_visibility
()
height
=
self
.
combo
.
winfo_height
()
self
.
_show_drop_down_listbox
()
self
.
combo
.
update
()
self
.
combo
.
event_generate
(
'<Return>'
)
self
.
combo
.
update
()
self
.
assertTrue
(
success
)
def
test_postcommand
(
self
):
success
=
[]
self
.
combo
[
'postcommand'
]
=
lambda
:
success
.
append
(
True
)
self
.
combo
.
pack
()
self
.
combo
.
wait_visibility
()
self
.
_show_drop_down_listbox
()
self
.
assertTrue
(
success
)
# testing postcommand removal
self
.
combo
[
'postcommand'
]
=
''
self
.
_show_drop_down_listbox
()
self
.
assertEqual
(
len
(
success
),
1
)
def
test_values
(
self
):
def
check_get_current
(
getval
,
currval
):
self
.
assertEqual
(
self
.
combo
.
get
(),
getval
)
self
.
assertEqual
(
self
.
combo
.
current
(),
currval
)
self
.
assertEqual
(
self
.
combo
[
'values'
],
()
if
tcl_version
<
(
8
,
5
)
else
''
)
check_get_current
(
''
,
-
1
)
self
.
checkParam
(
self
.
combo
,
'values'
,
'mon tue wed thur'
,
expected
=
(
'mon'
,
'tue'
,
'wed'
,
'thur'
))
self
.
checkParam
(
self
.
combo
,
'values'
,
(
'mon'
,
'tue'
,
'wed'
,
'thur'
))
self
.
checkParam
(
self
.
combo
,
'values'
,
(
42
,
3.14
,
''
,
'any string'
))
self
.
checkParam
(
self
.
combo
,
'values'
,
''
,
expected
=
''
if
get_tk_patchlevel
()
<
(
8
,
5
,
10
)
else
())
self
.
combo
[
'values'
]
=
[
'a'
,
1
,
'c'
]
self
.
combo
.
set
(
'c'
)
check_get_current
(
'c'
,
2
)
self
.
combo
.
current
(
0
)
check_get_current
(
'a'
,
0
)
self
.
combo
.
set
(
'd'
)
check_get_current
(
'd'
,
-
1
)
# testing values with empty string
self
.
combo
.
set
(
''
)
self
.
combo
[
'values'
]
=
(
1
,
2
,
''
,
3
)
check_get_current
(
''
,
2
)
# testing values with empty string set through configure
self
.
combo
.
configure
(
values
=
[
1
,
''
,
2
])
self
.
assertEqual
(
self
.
combo
[
'values'
],
(
'1'
,
''
,
'2'
)
if
self
.
wantobjects
else
'1 {} 2'
)
# testing values with spaces
self
.
combo
[
'values'
]
=
[
'a b'
,
'a
\
t
b'
,
'a
\
n
b'
]
self
.
assertEqual
(
self
.
combo
[
'values'
],
(
'a b'
,
'a
\
t
b'
,
'a
\
n
b'
)
if
self
.
wantobjects
else
'{a b} {a
\
t
b} {a
\
n
b}'
)
# testing values with special characters
self
.
combo
[
'values'
]
=
[
r'a\tb'
,
'"a"'
,
'} {'
]
self
.
assertEqual
(
self
.
combo
[
'values'
],
(
r'a\tb'
,
'"a"'
,
'} {'
)
if
self
.
wantobjects
else
r'a\\tb {"a"} \
}
\ \
{
')
# out of range
self.assertRaises(tkinter.TclError, self.combo.current,
len(self.combo['
values
']))
# it expects an integer (or something that can be converted to int)
self.assertRaises(tkinter.TclError, self.combo.current, '')
# testing creating combobox with empty string in values
combo2 = ttk.Combobox(self.root, values=[1, 2, ''])
self.assertEqual(combo2['
values
'],
('
1
', '
2
', '') if self.wantobjects else '
1
2
{}
')
combo2.destroy()
@
add_standard_options
(
IntegerSizeTests
,
StandardTtkOptionsTests
)
class
EntryTest
(
AbstractWidgetTest
,
unittest
.
TestCase
):
OPTIONS
=
(
'background'
,
'class'
,
'cursor'
,
'
exportselection
', '
font
',
'exportselection'
,
'font'
,
'foreground'
,
'invalidcommand'
,
'justify'
,
'show'
,
'state'
,
'style'
,
'takefocus'
,
'textvariable'
,
'validate'
,
'validatecommand'
,
'width'
,
'xscrollcommand'
,
...
...
@@ -534,6 +408,132 @@ class EntryTest(AbstractWidgetTest, unittest.TestCase):
self
.
assertEqual
(
self
.
entry
.
state
(),
())
@
add_standard_options
(
IntegerSizeTests
,
StandardTtkOptionsTests
)
class
ComboboxTest
(
EntryTest
,
unittest
.
TestCase
):
OPTIONS
=
(
'background'
,
'class'
,
'cursor'
,
'exportselection'
,
'font'
,
'foreground'
,
'height'
,
'invalidcommand'
,
'justify'
,
'postcommand'
,
'show'
,
'state'
,
'style'
,
'takefocus'
,
'textvariable'
,
'validate'
,
'validatecommand'
,
'values'
,
'width'
,
'xscrollcommand'
,
)
def
setUp
(
self
):
super
().
setUp
()
self
.
combo
=
self
.
create
()
def
create
(
self
,
**
kwargs
):
return
ttk
.
Combobox
(
self
.
root
,
**
kwargs
)
def
test_height
(
self
):
widget
=
self
.
create
()
self
.
checkParams
(
widget
,
'height'
,
100
,
101.2
,
102.6
,
-
100
,
0
,
'1i'
)
def
_show_drop_down_listbox
(
self
):
width
=
self
.
combo
.
winfo_width
()
self
.
combo
.
event_generate
(
'<ButtonPress-1>'
,
x
=
width
-
5
,
y
=
5
)
self
.
combo
.
event_generate
(
'<ButtonRelease-1>'
,
x
=
width
-
5
,
y
=
5
)
self
.
combo
.
update_idletasks
()
def
test_virtual_event
(
self
):
success
=
[]
self
.
combo
[
'values'
]
=
[
1
]
self
.
combo
.
bind
(
'<<ComboboxSelected>>'
,
lambda
evt
:
success
.
append
(
True
))
self
.
combo
.
pack
()
self
.
combo
.
wait_visibility
()
height
=
self
.
combo
.
winfo_height
()
self
.
_show_drop_down_listbox
()
self
.
combo
.
update
()
self
.
combo
.
event_generate
(
'<Return>'
)
self
.
combo
.
update
()
self
.
assertTrue
(
success
)
def
test_postcommand
(
self
):
success
=
[]
self
.
combo
[
'postcommand'
]
=
lambda
:
success
.
append
(
True
)
self
.
combo
.
pack
()
self
.
combo
.
wait_visibility
()
self
.
_show_drop_down_listbox
()
self
.
assertTrue
(
success
)
# testing postcommand removal
self
.
combo
[
'postcommand'
]
=
''
self
.
_show_drop_down_listbox
()
self
.
assertEqual
(
len
(
success
),
1
)
def
test_values
(
self
):
def
check_get_current
(
getval
,
currval
):
self
.
assertEqual
(
self
.
combo
.
get
(),
getval
)
self
.
assertEqual
(
self
.
combo
.
current
(),
currval
)
self
.
assertEqual
(
self
.
combo
[
'values'
],
()
if
tcl_version
<
(
8
,
5
)
else
''
)
check_get_current
(
''
,
-
1
)
self
.
checkParam
(
self
.
combo
,
'values'
,
'mon tue wed thur'
,
expected
=
(
'mon'
,
'tue'
,
'wed'
,
'thur'
))
self
.
checkParam
(
self
.
combo
,
'values'
,
(
'mon'
,
'tue'
,
'wed'
,
'thur'
))
self
.
checkParam
(
self
.
combo
,
'values'
,
(
42
,
3.14
,
''
,
'any string'
))
self
.
checkParam
(
self
.
combo
,
'values'
,
''
,
expected
=
''
if
get_tk_patchlevel
()
<
(
8
,
5
,
10
)
else
())
self
.
combo
[
'values'
]
=
[
'a'
,
1
,
'c'
]
self
.
combo
.
set
(
'c'
)
check_get_current
(
'c'
,
2
)
self
.
combo
.
current
(
0
)
check_get_current
(
'a'
,
0
)
self
.
combo
.
set
(
'd'
)
check_get_current
(
'd'
,
-
1
)
# testing values with empty string
self
.
combo
.
set
(
''
)
self
.
combo
[
'values'
]
=
(
1
,
2
,
''
,
3
)
check_get_current
(
''
,
2
)
# testing values with empty string set through configure
self
.
combo
.
configure
(
values
=
[
1
,
''
,
2
])
self
.
assertEqual
(
self
.
combo
[
'values'
],
(
'1'
,
''
,
'2'
)
if
self
.
wantobjects
else
'1 {} 2'
)
# testing values with spaces
self
.
combo
[
'values'
]
=
[
'a b'
,
'a
\
t
b'
,
'a
\
n
b'
]
self
.
assertEqual
(
self
.
combo
[
'values'
],
(
'a b'
,
'a
\
t
b'
,
'a
\
n
b'
)
if
self
.
wantobjects
else
'{a b} {a
\
t
b} {a
\
n
b}'
)
# testing values with special characters
self
.
combo
[
'values'
]
=
[
r'a\tb'
,
'"a"'
,
'} {'
]
self
.
assertEqual
(
self
.
combo
[
'values'
],
(
r'a\tb'
,
'"a"'
,
'} {'
)
if
self
.
wantobjects
else
r'a\\tb {"a"} \
}
\ \
{
')
# out of range
self.assertRaises(tkinter.TclError, self.combo.current,
len(self.combo['
values
']))
# it expects an integer (or something that can be converted to int)
self.assertRaises(tkinter.TclError, self.combo.current, '')
# testing creating combobox with empty string in values
combo2 = ttk.Combobox(self.root, values=[1, 2, ''])
self.assertEqual(combo2['
values
'],
('
1
', '
2
', '') if self.wantobjects else '
1
2
{}
')
combo2.destroy()
@add_standard_options(IntegerSizeTests, StandardTtkOptionsTests)
class PanedWindowTest(AbstractWidgetTest, unittest.TestCase):
OPTIONS = (
...
...
@@ -674,7 +674,7 @@ class RadiobuttonTest(AbstractLabelTest, unittest.TestCase):
OPTIONS = (
'
class
', '
command
', '
compound
', '
cursor
',
'
image
',
'
state
', '
style
',
'
padding
', '
state
', '
style
',
'
takefocus
', '
text
', '
textvariable
',
'
underline
', '
value
', '
variable
', '
width
',
)
...
...
@@ -724,7 +724,7 @@ class RadiobuttonTest(AbstractLabelTest, unittest.TestCase):
class MenubuttonTest(AbstractLabelTest, unittest.TestCase):
OPTIONS = (
'
class
', '
compound
', '
cursor
', '
direction
',
'
image
', '
menu
', '
state
', '
style
',
'
image
', '
menu
', '
padding
', '
state
', '
style
',
'
takefocus
', '
text
', '
textvariable
',
'
underline
', '
width
',
)
...
...
@@ -902,7 +902,7 @@ class ScrollbarTest(AbstractWidgetTest, unittest.TestCase):
@
add_standard_options
(
IntegerSizeTests
,
StandardTtkOptionsTests
)
class
NotebookTest
(
AbstractWidgetTest
,
unittest
.
TestCase
):
OPTIONS
=
(
'class'
,
'cursor'
,
'height'
,
'padding'
,
'style'
,
'takefocus'
,
'class'
,
'cursor'
,
'height'
,
'padding'
,
'style'
,
'takefocus'
,
'width'
,
)
def
setUp
(
self
):
...
...
Lib/tkinter/test/widget_tests.py
View file @
568b223c
...
...
@@ -206,6 +206,33 @@ class AbstractWidgetTest(AbstractTkTest):
break
def
test_keys
(
self
):
widget
=
self
.
create
()
keys
=
widget
.
keys
()
# XXX
if
not
isinstance
(
widget
,
Scale
):
self
.
assertEqual
(
sorted
(
keys
),
sorted
(
widget
.
configure
()))
for
k
in
keys
:
widget
[
k
]
# Test if OPTIONS contains all keys
if
test
.
support
.
verbose
:
aliases
=
{
'bd'
:
'borderwidth'
,
'bg'
:
'background'
,
'fg'
:
'foreground'
,
'invcmd'
:
'invalidcommand'
,
'vcmd'
:
'validatecommand'
,
}
keys
=
set
(
keys
)
expected
=
set
(
self
.
OPTIONS
)
for
k
in
sorted
(
keys
-
expected
):
if
not
(
k
in
aliases
and
aliases
[
k
]
in
keys
and
aliases
[
k
]
in
expected
):
print
(
'%s.OPTIONS doesn
\
'
t contain "%s"'
%
(
self
.
__class__
.
__name__
,
k
))
class
StandardOptionsTests
:
STANDARD_OPTIONS
=
(
'activebackground'
,
'activeborderwidth'
,
'activeforeground'
,
'anchor'
,
...
...
Misc/NEWS
View file @
568b223c
...
...
@@ -201,6 +201,8 @@ Core and Builtins
Library
-------
-
Issue
#
26177
:
Fixed
the
keys
()
method
for
Canvas
and
Scrollbar
widgets
.
-
Issue
#
21042
:
Make
ctypes
.
util
.
find_library
()
return
the
full
path
on
Linux
,
similar
to
other
platforms
.
Patch
by
Tam
á
s
Bence
Gedai
.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment