gh-91827: Add method info_pathlevel() in tkinter (GH-91829)

This commit is contained in:
Serhiy Storchaka 2022-05-06 13:50:38 +03:00 committed by GitHub
parent d707d073be
commit 15dbe8570f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 75 additions and 23 deletions

View file

@ -30,6 +30,7 @@ button.pack(side=BOTTOM)
tk.mainloop()
"""
import collections
import enum
import sys
import types
@ -143,6 +144,28 @@ def _splitdict(tk, v, cut_minus=True, conv=None):
dict[key] = value
return dict
class _VersionInfoType(collections.namedtuple('_VersionInfoType',
('major', 'minor', 'micro', 'releaselevel', 'serial'))):
def __str__(self):
if self.releaselevel == 'final':
return f'{self.major}.{self.minor}.{self.micro}'
else:
return f'{self.major}.{self.minor}{self.releaselevel[0]}{self.serial}'
def _parse_version(version):
import re
m = re.fullmatch(r'(\d+)\.(\d+)([ab.])(\d+)', version)
major, minor, releaselevel, serial = m.groups()
major, minor, serial = int(major), int(minor), int(serial)
if releaselevel == '.':
micro = serial
serial = 0
releaselevel = 'final'
else:
micro = 0
releaselevel = {'a': 'alpha', 'b': 'beta'}[releaselevel]
return _VersionInfoType(major, minor, micro, releaselevel, serial)
@enum._simple_enum(enum.StrEnum)
class EventType:
@ -1055,6 +1078,11 @@ class Misc:
lift = tkraise
def info_patchlevel(self):
"""Returns the exact version of the Tcl library."""
patchlevel = self.tk.call('info', 'patchlevel')
return _parse_version(patchlevel)
def winfo_atom(self, name, displayof=0):
"""Return integer which represents atom NAME."""
args = ('winfo', 'atom') + self._displayof(displayof) + (name,)

View file

@ -101,15 +101,7 @@ def get_tk_patchlevel():
global _tk_patchlevel
if _tk_patchlevel is None:
tcl = tkinter.Tcl()
patchlevel = tcl.call('info', 'patchlevel')
m = re.fullmatch(r'(\d+)\.(\d+)([ab.])(\d+)', patchlevel)
major, minor, releaselevel, serial = m.groups()
major, minor, serial = int(major), int(minor), int(serial)
releaselevel = {'a': 'alpha', 'b': 'beta', '.': 'final'}[releaselevel]
if releaselevel == 'final':
_tk_patchlevel = major, minor, serial, releaselevel, 0
else:
_tk_patchlevel = major, minor, 0, releaselevel, serial
_tk_patchlevel = tcl.info_patchlevel()
return _tk_patchlevel
units = {

View file

@ -341,6 +341,35 @@ class MiscTest(AbstractTkTest, unittest.TestCase):
self.assertEqual(log, [1])
self.assertTrue(self.root.winfo_exists())
def test_info_patchlevel(self):
vi = self.root.info_patchlevel()
f = tkinter.Frame(self.root)
self.assertEqual(f.info_patchlevel(), vi)
# The following is almost a copy of tests for sys.version_info.
self.assertIsInstance(vi[:], tuple)
self.assertEqual(len(vi), 5)
self.assertIsInstance(vi[0], int)
self.assertIsInstance(vi[1], int)
self.assertIsInstance(vi[2], int)
self.assertIn(vi[3], ("alpha", "beta", "candidate", "final"))
self.assertIsInstance(vi[4], int)
self.assertIsInstance(vi.major, int)
self.assertIsInstance(vi.minor, int)
self.assertIsInstance(vi.micro, int)
self.assertIn(vi.releaselevel, ("alpha", "beta", "final"))
self.assertIsInstance(vi.serial, int)
self.assertEqual(vi[0], vi.major)
self.assertEqual(vi[1], vi.minor)
self.assertEqual(vi[2], vi.micro)
self.assertEqual(vi[3], vi.releaselevel)
self.assertEqual(vi[4], vi.serial)
self.assertTrue(vi > (1,0,0))
if vi.releaselevel == 'final':
self.assertEqual(vi.serial, 0)
else:
self.assertEqual(vi.micro, 0)
self.assertTrue(str(vi).startswith(f'{vi.major}.{vi.minor}'))
class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase):

View file

@ -517,4 +517,4 @@ def add_standard_options(*source_classes):
def setUpModule():
if test.support.verbose:
tcl = tkinter.Tcl()
print('patchlevel =', tcl.call('info', 'patchlevel'))
print('patchlevel =', tcl.call('info', 'patchlevel'), flush=True)