--- /dev/null
+# test_tkinter_pipe.py
+import unittest
+import subprocess
+import sys
+from test import support
+
+
+@unittest.skipUnless(support.has_subprocess_support, "test requires subprocess")
+class TkinterPipeTest(unittest.TestCase):
+
+ def test_tkinter_pipe_buffered(self):
+ args = [sys.executable, "-i"]
+ proc = subprocess.Popen(args,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ proc.stdin.write(b"import tkinter\n")
+ proc.stdin.write(b"interpreter = tkinter.Tcl()\n")
+ proc.stdin.write(b"print('hello')\n")
+ proc.stdin.write(b"print('goodbye')\n")
+ proc.stdin.write(b"quit()\n")
+ stdout, stderr = proc.communicate(timeout=support.SHORT_TIMEOUT)
+ stdout = stdout.decode()
+ self.assertEqual(stdout.split(), ['hello', 'goodbye'])
+
+ def test_tkinter_pipe_unbuffered(self):
+ args = [sys.executable, "-i", "-u"]
+ proc = subprocess.Popen(args,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ proc.stdin.write(b"import tkinter\n")
+ proc.stdin.write(b"interpreter = tkinter.Tcl()\n")
+
+ proc.stdin.write(b"print('hello')\n")
+ proc.stdin.flush()
+ stdout = proc.stdout.readline()
+ stdout = stdout.decode()
+ self.assertEqual(stdout.strip(), 'hello')
+
+ proc.stdin.write(b"print('hello again')\n")
+ proc.stdin.flush()
+ stdout = proc.stdout.readline()
+ stdout = stdout.decode()
+ self.assertEqual(stdout.strip(), 'hello again')
+
+ proc.stdin.write(b"print('goodbye')\n")
+ proc.stdin.write(b"quit()\n")
+ stdout, stderr = proc.communicate(timeout=support.SHORT_TIMEOUT)
+ stdout = stdout.decode()
+ self.assertEqual(stdout.strip(), 'goodbye')
+
+
+if __name__ == "__main__":
+ unittest.main()
};
#ifdef WAIT_FOR_STDIN
+#ifndef MS_WINDOWS
static int stdin_ready = 0;
-#ifndef MS_WINDOWS
static void
MyFileProc(void *clientData, int mask)
{
static int
EventHook(void)
{
-#ifndef MS_WINDOWS
+#ifdef MS_WINDOWS
+ HANDLE hStdin;
+ DWORD type;
+#else
int tfile;
+ stdin_ready = 0;
#endif
PyEval_RestoreThread(event_tstate);
- stdin_ready = 0;
errorInCmd = 0;
-#ifndef MS_WINDOWS
+#ifdef MS_WINDOWS
+ hStdin = GetStdHandle(STD_INPUT_HANDLE);
+ type = GetFileType(hStdin);
+ while (1) {
+#else
tfile = fileno(stdin);
Tcl_CreateFileHandler(tfile, TCL_READABLE, MyFileProc,
(void *)(Py_intptr_t)tfile);
-#endif
while (!stdin_ready) {
+#endif
int result;
#ifdef MS_WINDOWS
- if (_kbhit()) {
- stdin_ready = 1;
+ if (type == FILE_TYPE_CHAR) {
+ if (_kbhit()) break;
+ }
+ else if (type == FILE_TYPE_PIPE) {
+ DWORD available;
+ if (PeekNamedPipe(hStdin, NULL, 0, NULL, &available, NULL)) {
+ if (available > 0) break;
+ }
+ else {
+ if (GetLastError() == ERROR_BROKEN_PIPE) break;
+ }
+ }
+ else if (type == FILE_TYPE_DISK) {
break;
}
#endif