Merge with 3.5

This commit is contained in:
Terry Jan Reedy 2016-06-11 02:06:40 -04:00
commit b5c43f4c01
2 changed files with 85 additions and 1 deletions

View File

@ -1403,6 +1403,17 @@ class PseudoInputFile(PseudoFile):
self.shell.close() self.shell.close()
def fix_x11_paste(root):
"Make paste replace selection on x11. See issue #5124."
if root._windowingsystem == 'x11':
for cls in 'Text', 'Entry', 'Spinbox':
root.bind_class(
cls,
'<<Paste>>',
'catch {%W delete sel.first sel.last}\n' +
root.bind_class(cls, '<<Paste>>'))
usage_msg = """\ usage_msg = """\
USAGE: idle [-deins] [-t title] [file]* USAGE: idle [-deins] [-t title] [file]*
@ -1535,8 +1546,10 @@ def main():
'editor-on-startup', type='bool') 'editor-on-startup', type='bool')
enable_edit = enable_edit or edit_start enable_edit = enable_edit or edit_start
enable_shell = enable_shell or not enable_edit enable_shell = enable_shell or not enable_edit
# start editor and/or shell windows: # start editor and/or shell windows:
root = Tk(className="Idle") root = Tk(className="Idle")
root.withdraw()
# set application icon # set application icon
icondir = os.path.join(os.path.dirname(__file__), 'Icons') icondir = os.path.join(os.path.dirname(__file__), 'Icons')
@ -1551,7 +1564,7 @@ def main():
root.wm_iconphoto(True, *icons) root.wm_iconphoto(True, *icons)
fixwordbreaks(root) fixwordbreaks(root)
root.withdraw() fix_x11_paste(root)
flist = PyShellFileList(root) flist = PyShellFileList(root)
macosx.setupApp(root, flist) macosx.setupApp(root, flist)

View File

@ -0,0 +1,71 @@
'''Test (selected) IDLE Edit menu items.
Edit modules have their own test files files
'''
from test.support import requires
requires('gui')
import tkinter as tk
import unittest
from idlelib import PyShell
class PasteTest(unittest.TestCase):
'''Test pasting into widgets that allow pasting.
On X11, replacing selections requires tk fix.
'''
@classmethod
def setUpClass(cls):
cls.root = root = tk.Tk()
PyShell.fix_x11_paste(root)
cls.text = tk.Text(root)
cls.entry = tk.Entry(root)
cls.spin = tk.Spinbox(root)
root.clipboard_clear()
root.clipboard_append('two')
@classmethod
def tearDownClass(cls):
del cls.text, cls.entry, cls.spin
cls.root.clipboard_clear()
cls.root.update_idletasks()
cls.root.destroy()
del cls.root
def test_paste_text(self):
"Test pasting into text with and without a selection."
text = self.text
for tag, ans in ('', 'onetwo\n'), ('sel', 'two\n'):
with self.subTest(tag=tag, ans=ans):
text.delete('1.0', 'end')
text.insert('1.0', 'one', tag)
text.event_generate('<<Paste>>')
self.assertEqual(text.get('1.0', 'end'), ans)
def test_paste_entry(self):
"Test pasting into an entry with and without a selection."
# On 3.6, generated <<Paste>> fails without empty select range
# for 'no selection'. Live widget works fine.
entry = self.entry
for end, ans in (0, 'onetwo'), ('end', 'two'):
with self.subTest(entry=entry, end=end, ans=ans):
entry.delete(0, 'end')
entry.insert(0, 'one')
entry.select_range(0, end) # see note
entry.event_generate('<<Paste>>')
self.assertEqual(entry.get(), ans)
def test_paste_spin(self):
"Test pasting into a spinbox with and without a selection."
# See note above for entry.
spin = self.spin
for end, ans in (0, 'onetwo'), ('end', 'two'):
with self.subTest(end=end, ans=ans):
spin.delete(0, 'end')
spin.insert(0, 'one')
spin.selection('range', 0, end) # see note
spin.event_generate('<<Paste>>')
self.assertEqual(spin.get(), ans)
if __name__ == '__main__':
unittest.main(verbosity=2)