Merge with 3.5
This commit is contained in:
commit
b5c43f4c01
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue