1 Востаннє редагувалося plusxx (16.02.2020 22:28:43)

Тема: Безперервний ввід вивід інформації.

Коротше так, коли пес не знає, що робити то... Ну то та сама ситуація. Хочу перенести оце https://replace.org.ua/topic/10799/
з плюсів на Python. Хочу реалізувати ввід та вивід в окремих потоках. Але, проблема в тому, що програма все-одно чекає на ввід, і тому вивід продовжується тільки після того як натискається клавіша. 

#-*- coding: utf-8 -*-
from threading import Thread
import subprocess
import platform
import getch
import time
#import msvcrt # for windows

from graphikcs import Graphics 

def output_func():
    while True:
        for row in g.road:
            print(row)
        #time.sleep(1)
        if platform.system == "Windows":#clear if youre os is windows
            subprocess.Popen("cls", shell=True).communicate()
        else:
            print("\033c")

def input_func():
    while True:

        car_position = 0
        if platform.system == "Windows":
            char = msvcrt.getche()
        else:
            char = getch.getch()

        if char in ['d','D','В','в']:
            pass
        if char in ['a','A','ф','Ф']:
            if car_position > -3:
                car_position -=1
                g.car_left()
                char = None
        if char in ['W','w','Ц','ц']:
            pass
        if char in ['S','s','І','і','Ы','ы']:
            pass


if __name__=="__main__":
    g = Graphics()
    thread1 = Thread(target=output_func)
    thread2 = Thread(target=input_func)
    thread1.start()
    thread2.start()
    thread1.join()
    thread2.join()

Пробував конструкцію

char = getch.getch()|""

Так не працює ввід, і ще кілька конструкцій з іфами теж не працювало. Хтось може робив щось подібне, поділіться досвідом?

2

Re: Безперервний ввід вивід інформації.

        else:
            if getch.getch() in ['d','D','В','в','a','A','ф','Ф','W','w','Ц','ц','S','s','І','і','Ы','ы']:
                char = getch.getch()
            else:
                pass

Така конструкція дала слідуючий результат якщо я натисну одну з клавіш котрі знаходяться в масиві то працює ввід а вивід не хоче працювати
якщо ж натисну іншу то працює вивід а ввідпрацювати не хоче результат треба гуглити управління потоками.

3

Re: Безперервний ввід вивід інформації.

subprocess.Popen("cls", shell=True).communicate()

Це якийсь пиздець, вибачте за мою французьку. cls - це команда віндошного cmd; в bash є схожа команда clear, але це в будь-якому разі очевидна надмірність - створювати процес оболонки виключно для того, щоб почистити екран.

Наполегливо раджу заводити всі відмінні в різних системах речі у власні функції, щоб основний код не перевіряв, де він зараз знаходиться, це дуже відволікає. У версії 0.1 -

def get_char():
        if platform.system == "Windows":
            return msvcrt.getche()
        else:
            return getch.getch()

char = get_char()

чи навіть

if platform.system == "Windows":
    get_char = msvcrt.getche
else:
    get_char = getch.getch
char = get_char()

Але в будь-якому разі ви маєте визначитися, із чим саме ви працюєте. Консоль не дуже добре влаштована для роботи з окремими натисканнями клавіш. Може, просто візьмете pygame і не будете велосипед вигадувати?

4

Re: Безперервний ввід вивід інформації.

koala написав:
Прихований текст
subprocess.Popen("cls", shell=True).communicate()

Це якийсь пиздець, вибачте за мою французьку. cls - це команда віндошного cmd; в bash є схожа команда clear, але це в будь-якому разі очевидна надмірність - створювати процес оболонки виключно для того, щоб почистити екран.

Наполегливо раджу заводити всі відмінні в різних системах речі у власні функції, щоб основний код не перевіряв, де він зараз знаходиться, це дуже відволікає. У версії 0.1 -

def get_char():
        if platform.system == "Windows":
            return msvcrt.getche()
        else:
            return getch.getch()

char = get_char()

чи навіть

if platform.system == "Windows":
    get_char = msvcrt.getche
else:
    get_char = getch.getch
char = get_char()

Але в будь-якому разі ви маєте визначитися, із чим саме ви працюєте. Консоль не дуже добре влаштована для роботи з окремими натисканнями клавіш. Може, просто візьмете pygame і не будете велосипед вигадувати?

Дякую за зауваження стосовно оформлення коду і помилок.
Я не хочу в пайгейм я хочу в консолі  ,

5

Re: Безперервний ввід вивід інформації.

Ви розумієте, що консоль - це потік символів? Консоль може бути, наприклад, парою клавіатура/мережа чи мережа/принтер (aka телетайп)?

Подякували: leofun011

6

Re: Безперервний ввід вивід інформації.

koala написав:

Ви розумієте, що консоль - це потік символів? Консоль може бути, наприклад, парою клавіатура/мережа чи мережа/принтер (aka телетайп)?

Розумію, але на  плюсах працює той на пітоні можна його  якось забадяжити.

7

Re: Безперервний ввід вивід інформації.

Ні, схоже, не розумієте. На яких саме плюсах у якій саме системі? Це суттєво. Якщо ви пишете під Windows - тоді добре, але нащо ви тоді кросплатформові фішки додаєте?

8 Востаннє редагувалося plusxx (17.02.2020 20:21:19)

Re: Безперервний ввід вивід інформації.

На С++ під лінукс

#include <sys/ioctl.h>
#include <unistd.h>
#include <termios.h>
#include "systemelements.h"
#include <iostream>

using namespace std;

void systemElements::clear()//очистка екрана
        {
            cout << "\033[0d\033[2J";
        }
int systemElements::getch(void)// неперервне зчитування з клавіатури (syys/ioctl.h, unistd.h, termios,h)
    {
        struct termios oldt, newt;
        int ch;

        tcgetattr(STDIN_FILENO, &oldt);
        newt = oldt;
        newt.c_lflag &= ~(ICANON | ECHO);
        tcsetattr(STDIN_FILENO, TCSANOW, &newt);
        ch = getchar();
        tcsetattr(STDIN_FILENO, TCSANOW, &oldt);

        return ch;
    }
bool systemElements::kbhit()//функція котра дає сигнал true пoки нажата клавіша
    {
        termios term;
        tcgetattr(0, &term);

        termios term2 = term;
        term2.c_lflag &= ~ICANON;
        tcsetattr(0, TCSANOW, &term2);

        int byteswaiting;
        ioctl(0, FIONREAD, &byteswaiting);

        tcsetattr(0, TCSANOW, &term);

        return byteswaiting > 0;
    }

int systemElements::fiGameControlInput(int nCarPosition)//Функція керування
    {
        char cGameControlVariable='\0';

                while(true)//керування
                     {
                          if(kbhit())
                            {
                               cGameControlVariable=getch();
                                if(cGameControlVariable=='p'||cGameControlVariable=='P')//Пауза в грі
                                    {
                                        if(cGameControlVariable!='s'||cGameControlVariable!='S')//вихід з паузи
                                            {
                                                cout<<"pause \n pres 's' end 'Enter' to continue"<<endl;//повідомлення про паузу
                                                cin>>cGameControlVariable;
                                            }
                                    }
                                if(cGameControlVariable=='Z')//якщо змінна = "Z" то
                                   {
                                      cGameControlVariable='z';//то змінній присвоїти "z"
                                    }

                                if (cGameControlVariable=='q'||cGameControlVariable=='Q')//якщо умова вірна
                                     {
                                         cout<<"Game Over";
                                         return 0;
                                      }

                                if (cGameControlVariable=='z'&&nCarPosition>0)
                                     {
                                          nCarPosition--;
                                     }

                                if (cGameControlVariable=='/'&&nCarPosition<2)
                                     {
                                           nCarPosition++;
                                     }

                                cGameControlVariable='\0';
                                break;
                        }
                    else
                        {
                            break;
                        }

                    }
                return nCarPosition;

        }
Подякували: koala1

9

Re: Безперервний ввід вивід інформації.

Чому ncurses не послуговуєтеся?

Подякували: plusxx, leofun012

10

Re: Безперервний ввід вивід інформації.

0xDADA11C7 написав:

Чому ncurses не послуговуєтеся?

Бо нічого не знав про неї. Дякую подивлюсь я ж думав що всі ті інтерфейси для термінала створюються в ручну я навіть колись менюшку подібну як в браузері Links в ручну пилив.

11

Re: Безперервний ввід вивід інформації.

Та ось вам: https://stackoverflow.com/questions/510 … m-the-user
Хоча офіційні ЧаПи радять ncurses.

Подякували: plusxx1